XML und Interfaces aus anderen Projekten

internet

Top Contributor
Hallo,

ich habe gerade folgendes Problem:
Ich habe ein "Share Projekt", dass ich quasi als Lib nutzen möchte, sodass es andere Projekte nutzen kann.
In diesem Projekt habe ich eine XML "Condition":

Hier habe ich zusätzlich ein Object "ActionGeneralComponentInterface".
Das soll ein Interface sein, da hier dann verschiedene "Aktionen" abgeleitet werden soll.
Allerdings werden die Aktionen nicht nur in diesem "SharedProjekt" implementiert, sodass die Klassen "MyClass3", "MyClass4"... aus anderen Projekten kommen sollen. Diese Klasse kennt allerdings das "SharedProjekt" nicht.

Gebe ich die Klassen nicht explizit an, sondern ohne @XmlElements, und nutze nur das Interface, bekomme ich diese Fehlermeldung:
Code:
ActionComponentInterface ist eine Schnittstelle, und JAXB kann keine Schnittstellen verarbeiten.

Java:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Condition  {

    @XmlElements({
            @XmlElement(name = "MyClass1", type = MyClass1.class),
            @XmlElement(name = "MyClass2", type = MyClass2.class),
    })
    private ActionGeneralComponentInterface actionGeneralComponentInterface;

Wie könnte ich das entsprechend implementieren?

Meiner Meinung müsste dieser Code dann im jeweiligen Projekt implementiert werden?
Code:
@XmlElements({
            @XmlElement(name = "MyClass1", type = MyClass1.class),
            @XmlElement(name = "MyClass2", type = MyClass2.class),
    })
    private ActionGeneralComponentInterface actionGeneralComponentInterface;

Die Frage ist dann aber welche Klasse ich bei "Condition" verwende?
Also was nutze ich dann bei Condition anstatt "private ActionGeneralComponentInterface actionGeneralComponentInterface" ?
 
Du könntest versuchen, das JAXB-Annotation @XmlSeeAlso zu verwenden, um die Klassen, die von dem Interface abgeleitet werden, zu spezifizieren. Dazu fügst du einfach eine Annotation mit dem Typ der abgeleiteten Klassen hinzu:

Java:
@XmlSeeAlso({MyClass1.class, MyClass2.class})
public interface ActionGeneralComponentInterface {
// ...
}

Dann sollte es möglich sein, das Interface in deiner Klasse Condition zu verwenden:

Code:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Condition  {

private ActionGeneralComponentInterface actionGeneralComponentInterface;


Das Interface selbst wird dann von JAXB nicht verarbeitet, aber die abgeleiteten Klassen, die in der Annotation @XmlSeeAlso spezifiziert wurden, schon.

Alternativ könntest du auch versuchen, eine abstrakte Klasse zu verwenden, die von dem Interface abgeleitet wird und die JAXB-Annotationen enthält. Die abgeleiteten Klassen würden dann von dieser abstrakten Klasse erben und müssten keine Annotationen mehr enthalten. Dies könnte die Implementierung etwas einfacher machen, aber es hängt auch von deiner spezifischen Anforderungen ab, welche Lösung am besten geeignet ist.
 
danke dir, aber das wird so nicht gehen...

Du könntest versuchen, das JAXB-Annotation @XmlSeeAlso zu verwenden, um die Klassen, die von dem Interface abgeleitet werden, zu spezifizieren. Dazu fügst du einfach eine Annotation mit dem Typ der abgeleiteten Klassen hinzu:

Java:
@XmlSeeAlso({MyClass1.class, MyClass2.class})
public interface ActionGeneralComponentInterface {
// ...
}

Das Problem ist hier aber, dass Projekt1 (ShareProject) MyClass2.class sich NICHT in diesem Projekt befindet, in welchem auch das Interface sich befindet....
  • Project2 kann nur auf Projekt1 zugreifen
  • Projekt1 (ShareProject) kann NICHT auf Projekt2 zugreifen...
Ich bräuchte etwas wie:
Interface -> in meinem ShareProject...
Class1, Class2 -> in meinem eigentlichen Projekt...

Problem ist dann eben:
Weder class myproject.xml.MyClass1 noch eine der zugehörigen Superklassen ist diesem Kontext bekannt.
 
Zuletzt bearbeitet:
Ich habe mal noch diese Annotionen probiert:

Java:
@XmlAnyElement
private ActionGeneralComponentInterface actionGeneralComponentInterface;

oder

Java:
@XmlElement(type = Object.class)
private ActionGeneralComponentInterface actionGeneralComponentInterface;

Aber auch das scheint nicht zu gehen... Hat noch jemand eine Idee?
 

Zurück
Oben