JAXB can't handle interfaces

turmaline

Bekanntes Mitglied
Hallo Leute,

ich habe eine Klasse "Document". Diese hat verschiedene Attribute, unter anderem

AnnotationSet aSet; // AnnotationSet ist ein Interface aus einem jar
DocumentBase docBase; // DocumentBase ist auch ein Interface

Ich möchte gerne meine Dokumente persistent in einer XML-Datei speichern und nach dem ein bießchen Einlesen heute, entschied ich mich für JAXB. Bei der Ausführung eines einfachen Testprogramms, bakam ich folgende Fehler-Meldung:

AnnotationSet is an interface, and JAXB can't handle interfaces.

Ich habe den Weg mit Annotationen verwendet, wie hier (Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 15.8 Java Architecture for XML Binding (JAXB)).

Es ist ja völlig normal, dass man mit Interfaces programmiert oder? Mach ich etwas falsch oder muss ich eine andere Möglichkeit suchen, meine Dokumente zu speichern?
Bitte, so einfach wie möglich erklären, bin nicht so lange beim Programmieren.

lG,madlena
 

turmaline

Bekanntes Mitglied
leider war das ironisch gemeint.. aber ich bin selber schuld, da ich wenig informationen gegeben habe. Ich hab Dein Beispiel (JaxbTest) angeschaut. Entweder verstehe ich das falsch oder ist das nicht das was ich brauche. In meinem Fall gibt es unter anderem Interfaces, die aus einem jar benutzt werden. Ich kann da in der Implementierung nichts ändern.
Kannst Du mir da weiter helfen oder hab ich schon wieder zu wenig gesagt?
 

turmaline

Bekanntes Mitglied
heißt das, dass ich für alle Schnittstellen eine Bean-Implementierung schreiben muss? ich meine wenn

AnnotationSet enthält mehrere Annotations und Annotation besteht aus MappingArgument und MappingValue und dabei AnnotationSet, Annotation, MappingArgument und mappingValue alles Interfaces sind, muss ich für jedes Interface eine Bean-Impl erstellen?
 

turmaline

Bekanntes Mitglied
Im Prinzip bräucte ich keine (eigene) Bean-Implementierung für das Interface, wenn die Implementierung nicht annotiert werden muss. Also ich könnte dann einen Adapter

public class AnnotationAdapter extends XmlAdapter <AnnotationImpl, Annotation>

wobei Annotation ein Interface ist und AnnotationImpl seine Implementierung aus jar.

Wenn ich aber die Implementierung annotieren muss und das nicht kann, da ich keinen Zugriff auf Code habe, muss ich eine Bean-Impl erstellen, diese annotieren und noch einen zusätzlichen Adapter erstellen:

public class AnnotationImplAdapter extends XmlAdapter <AnnotationBean, AnnotationImpl>

Also im Prinzip brauche ich dann zwei Adapter. Hab ich richtig verstanden? Stimmt die Richtung bei Adaptern?
 

turmaline

Bekanntes Mitglied
Also so langsam komme ich durcheinander.. :( Ich hab jetzt für jedes Interface zwei Adaptern:

Java:
public class MappingAdapter extends XmlAdapter <MappingImpl, Mapping> 
{
	@Override
	public MappingImpl marshal(Mapping mapping) throws Exception 
	{
		MappingImpl mImpl = new MappingImpl ();
		mImpl.setMappingArgument(mapping.getMappingArgument());
		mImpl.setMappingValue(mapping.getMappingValue());
		
		return mImpl;
	}

	@Override
	public Mapping unmarshal(MappingImpl mImpl) throws Exception 
	{
		return mImpl;
	}
	
}

und

Java:
public class MappingImplAdapter extends XmlAdapter <MappingBean, MappingImpl> 
{

	@Override
	public MappingBean marshal(MappingImpl mImpl) throws Exception 
	{
		MappingBean mBean = new MappingBean ();
		mBean.setMappingArgument(mImpl.getMappingArgument());
		mBean.setMappingValue(mImpl.getMappingValue());
		return mBean;
	}

	@Override
	public MappingImpl unmarshal(MappingBean mBean) throws Exception 
	{
		MappingImpl mImpl = new MappingImpl ();
		mImpl.setMappingArgument(mBean.getMappingArgument());
		mImpl.setMappingValue(mBean.getMappingValue());
		return mImpl;
	}

}

Nun weiß ich nicht wo ich welchen Adapter einsetzen muss.


Java:
public class AnnotationBean implements Annotation 
{
	private int id;
	@XmlJavaTypeAdapter(MappingAdapter.class)
	private Mapping mapping;
	
	public int getId() 
	{
		return this.id;
	}
	
	public void setId(int id) 
	{
	   this.id = id; 		
	}

	public Mapping getMapping() 
	{
		return this.mapping;
	}

	public void setMapping(Mapping mapping) 
	{
	   this.mapping = mapping;
	}

}

Oder muss im letzten Code-Teil stehen:

@XmlJavaTypeAdapter(MappingImplAdapter.class)
MappingBean mappinBean;

In diesem Fall stimmt die Implementierung von setters / getters nicht mehr... Oder soll AnnotationBean nicht implements Annotation...

Also wie Du siehst bin ich völlig verwirrt... :(
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Nee kannst das Ganze mit einem Adapter abhandeln. Musst ja nur eine Interface-Implementierung rausgeben. Welche das ist, spielt keine Rolle.

[c]XmlAdapter <Annotation, AnnotationImpl>[/c] würde also reichen.
 

turmaline

Bekanntes Mitglied
ja aber AnnotationIml ist aus dem jar, dh ich kann sie nicht annotieren. Oder meinst Du mit AnnotationImpl die Bean-Implementierung?

Muss es nicht

Java:
XmlAdapter <AnnotationImpl, Annotation>
heißen? Interface ist ja in diesem Fall BoundType oder
 

Noctarius

Top Contributor
Ja war jetzt nur Beispiel :D

Wie du beim marshall und unmarshall die Sachen verpackst ist aber deine Sache, da das Bean ja zwangsweise dann auch eine Interface-Definition ist kannst du dieses einfach rein- bzw rauswerfen.
 

turmaline

Bekanntes Mitglied
ja :) mit Anfängern sind solche Beispiele gefährlich :)

jetzt habe ich ein Haufen Adaptern geschrieben und anscheinend sie falsch eingesetzt.
Also eine Map ist auch ein Interface, dafür brauche ich auch einen Adapter?

und was mache ich mit

Java:
Map<Integer, Annotation> map;
wenn Annotation ein Interface ist, wie soll ich sowas annotieren?
 

turmaline

Bekanntes Mitglied
ich weiß nicht, ob das jetzt sinnvoll war, aber ich habe folgenden Adapter für die Map geschrieben

Java:
XmlAdapter <HashMap <Integer, AnnotationBean>, Map<>Integer, Annotation>

im Adapter habe ich die map vor der rückgabe ausgegeben und sie war nicht leer, beim marshalling aber schon-- hab ich jetzt quatsch gemacht oder woran liegt es?..

sorry für die dummen fragen..:oops:
 

Noctarius

Top Contributor
Maps müsste JAXB von Haus aus kennen, kann mich aber grad nicht erinnern, da ich jetzt nicht wüsste, dass ich die daten schonmal in ner map weggespeichert hab
 

turmaline

Bekanntes Mitglied
so würdes mit Map funktionieren:

Java:
Map<Integer, String> map = new HashMap<Integer, String>;

ich habe aber eine Map:

Java:
Map<Integer, Annotation> map = new HashMap <Integer, Annotation> () ;

und Annotation ist ein Interface. Da bekomme ich einen Fehler. Deswegen habe ich einen Adapter geschrieben. Fehler ist verschwunden aber map ist leer... ((

ao sieht jetzt der Test-Adapter aus:

Java:
public class DingerMapAdapter extends XmlAdapter <HashMap <Integer, Ding>, Map <Integer, IDing>> 
{

	@Override
	public HashMap<Integer, Ding> marshal(Map<Integer, IDing> map)
			throws Exception 
	{
		HashMap<Integer, Ding> hm = new HashMap<Integer, Ding> ();
		for (Map.Entry<Integer, IDing> entry : map.entrySet())
		{
			Ding d = new Ding ();
			d.setID(entry.getValue().getID());
			hm.put(entry.getKey(), d);
			
		}
		
		System.out.println (hm);
		return hm;
	}

	@Override
	public Map<Integer, IDing> unmarshal(HashMap<Integer, Ding> hm)
			throws Exception 
	{
		Map<Integer, IDing> map = new HashMap <Integer, IDing> ();
		for (Map.Entry<Integer, Ding> entry : hm.entrySet())
		{
			IDing i = new Ding ();
			i.setID(entry.getValue().getID());
			map.put(entry.getKey(), i);
		}
		return map;
	}

}

Java:
@XmlRootElement (namespace = "...")
public class Document 
{
	private Map <Integer, IDing> dingerMap = new HashMap <Integer, IDing> ();
	
	public void setDingerMap (Map<Integer, IDing> dingerMap)
	{
		this.dingerMap = dingerMap;
	}
	
	@XmlJavaTypeAdapter (DingerMapAdapter.class)
	public Map<Integer, IDing> getDingerMap ()
	{
		return this.dingerMap;
	}
	
}

Java:
public class XMLBinding 
{

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException 
	{
		
		
		try 
		{
			Map<Integer, IDing> dingerMap = new HashMap <Integer, IDing> ();
			IDing dingA = new Ding (); dingA.setID(33);
			dingerMap.put(55, dingA);
			IDing dingB = new Ding (); dingB.setID(44);
			dingerMap.put(66, dingB);
			
			Document doc = new Document ();
		
			doc.setID("id1");
			doc.setDingerMap(dingerMap);
			
			Writer w = null;
			w = new FileWriter ("document.xml");
			
			JAXBContext context = JAXBContext.newInstance(Document.class);
			Marshaller m = context.createMarshaller();
			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
		        m.marshal(doc, w);
			
			m.marshal(doc, System.out);
			
			
			Unmarshaller um = context.createUnmarshaller();
			Document doc2 = (Document) um.unmarshal(new FileReader ("document.xml"));
			System.out.println(doc2.getID());
			System.out.println(doc2.getDingerMap());
		} 
		catch (JAXBException e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

Hast Du eine Ahnung warum ist die Map beim Marshalling leer?
 

Noctarius

Top Contributor
Klar kannst du das bestimmt generisch über Object, Object machen. Musst dann halt nur mit Reflection und den BeanUtils spielen (und am besten mit einer PropertyDescription).

(Btw: ein nettes kleines Projekt, dem sollte ich mich mal zuwenden ;))
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
HombreDelMundo JAXB can't handle interfaces XML & JSON 4
8u3631984 jaxb XML Mapper - Root Element mit Attribut XML & JSON 20
W jaxws jaxb wsdl Java-Klassen generieren und binding.xml verwenden XML & JSON 1
Rakshan Unmarshalling multiple namespaces with jaxb XML & JSON 0
B JAXB und HTML XML & JSON 1
E JAXB und java.nio.file.Path XML & JSON 4
W jaxb-api XML Feld nicht gesendet setzt das Defaultvalue nicht XML & JSON 3
S Muss ich bei JAXB immer noch eine zusaetzliche List-Wrapper Klasse erstellen wenn ich mehrere Objekte serialisieren will..? XML & JSON 1
S JAXB mit mehreren zusammenhängenden .xsd-Files XML & JSON 0
N JAXB: Überflüssiges Wrapper-Tag für Map-Einträge XML & JSON 0
D JAXB mit Map und Color XML & JSON 2
K JAXB-XML unvollständig XML & JSON 1
K JAXB Unmarshelling XML & JSON 1
E JAXB und abstrakte Klasse(n) XML & JSON 0
B JAXB - Unmarshal -> Kinder bekommen und die Kinder von den Kinder XML & JSON 7
B JAXB - Marshal ArrayList XML & JSON 2
B JAXB - java.util.Locale does not have a no-arg default constructor XML & JSON 2
B JAXB-Fehler bei REST-Api XML & JSON 0
M JAXB HashMap Dynamisches Laden XML & JSON 0
M JAXB @XMLID und @XMLIDREF, wie Daten hinzufügen XML & JSON 2
P JAXB-Problem XML & JSON 1
A JAXB: XMLMixed generieren XML & JSON 0
R [JAXB] XmlRootElement und XmlType gemeinsam nutzen XML & JSON 0
I XML to Object - Mapping mit JAXB 1.0 XML & JSON 1
L JAXB - Generischen Wert mit Liste belegen XML & JSON 1
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
K JAXB Annotation @XMLRootElement vererben XML & JSON 0
F JAXB Unmarshal - Kein "default Constructor" XML & JSON 2
F.S.WhiTeY JAXB: Schema nicht "erben" XML & JSON 2
B JAXB - manuell Klassen aus xsd XML & JSON 3
S Jaxb Unmarshalling Problem XML & JSON 4
S JAXB - Any Elementliste - wie Werte verändern? XML & JSON 4
R JAXB: A cycle is detected in the object graph. This will cause infinitely deep XML XML & JSON 6
M JAXB versucht abstrakte Klasse zu erzeugen XML & JSON 7
M JAXB: automatisches Groß schreiben Property XML & JSON 9
C Projekt - JAXB, EMF oder doch DOM? XML & JSON 4
C JAXB: XML-Elemente einlesen und als XML-Attribute ausgeben XML & JSON 7
R sax, stax, jdom, jaxb? List von Objekten speichern und laden XML & JSON 6
J JAXB: Mehrmals abspeichern XML & JSON 3
D XML Einlesen mit JaxB XML & JSON 4
W JAXB Binding customization XML & JSON 4
L JAXB und Interfaces XML & JSON 4
S Problem with JAXB unmarshalling classes that have the same name in @XmlRootElement XML & JSON 2
eykarhorn JAXB namespace attribut aus rootelement entfernen XML & JSON 2
nrg JAXB - nor any of its super class is known to this context XML & JSON 3
S aus XML mit JAXB zu Baumstruktur XML & JSON 3
nrg JAXB generell auf XMLs übertragbar XML & JSON 22
Landei JAXB: Wert von übergeordneten Element XML & JSON 4
B PropertyChangeListener generieren mit JAXB (xjc) XML & JSON 3
G JAXB und verschachtelte Elemente? XML & JSON 6
G JAXB XML-Attribute feststellen XML & JSON 4
S JAXB 2 und JSR 303 XML & JSON 11
M [JAXB] @XmlAnyElement namespace XML & JSON 4
R JAXB Unmarshal XML & JSON 2
J JAXB und ArrayList XML & JSON 4
Landei Jpa2 -> jaxb??? XML & JSON 9
M JAXB - HashMap XML & JSON 1
dzim JAXB-Unmarshalling ignoriert/löscht Einträge aus XML - oder lässt sie verschwinden XML & JSON 3
S JAXB 2 und Java Annotationen/Interfaces generieren XML & JSON 3
ruutaiokwu jaxb eclipse plugin... XML & JSON 3
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
R JAXB ausgewählte Felder XML & JSON 10
TiME-SPLiNTER JAXB: com.sun.xml.bind.v2.ContextFactory XML & JSON 3
V JAXB und leere Listen XML & JSON 2
L compareto(), equals() in JAXB generierten Dateien XML & JSON 3
D jaxb validierung/verification vor marshalling XML & JSON 3
J JAXB mit GregorianCalendar XML & JSON 4
N Individuelles Wrapper-Element um Collection mit JAXB XML & JSON 6
B JAXB Unmarshalling mehrerer Objekte XML & JSON 2
V JAXB schema 2 java XML & JSON 3
B JPA + JAXB Mapping Problem XML & JSON 2
S Navigieren in unbekannten JAXB-Objecten XML & JSON 2
J JAXB NullPointerException im ContextFinder XML & JSON 6
H JAXB und STAX XML & JSON 2
H JAXB Probleme beim Unmarshalling XML & JSON 3
C Serialisierung mit JAXB XML & JSON 6
K JAXB und Maps -> Marshalling-Problem XML & JSON 6
S JAXB und viele verschachtelte Attribute XML & JSON 1
J JAXB - Map XML & JSON 2
O JAXB generierte Klassen sollen Serializable implementieren XML & JSON 1
aze JaxB: Nullelemente in Array nicht anzeigen XML & JSON 3
sambalmueslie JAXB - Unmarshall ein XML-Document das aus zwei XSD Definitionen besteht XML & JSON 8
S JAXB und abstrakte Klasse(n) XML & JSON 4
P JAXB: Marshalling XML & JSON 7
aze JaxB Elemente in LinkedHashSet werden nicht wiededergegeben XML & JSON 3
M JAXB: Wie folgendes Konstrukt abbilden? XML & JSON 20
A Jaxb und Interfaces XML & JSON 12
B JaxB und XSD :-) XML & JSON 8
G JAXB - Marshaller - kein Rückgabewert XML & JSON 2
N XML will nicht weder JAXB noch XStream XML & JSON 8
F Zugriff auf durch JAXB erzeugte Object-Struktur... XML & JSON 6
C Java-Imports bei Jaxb XML & JSON 8
F Marshaling eines JAXB Objektes worin ein anderes JAXB Objekt eingeschlossen ist XML & JSON 6
K JAXB, Vererbung und Codegeneration XML & JSON 2
M XmlRootElement und JAXB XML & JSON 4
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
G jaxb Vector (oder ähnliches) von Elementen generieren XML & JSON 6
M Jaxb Annotationen, Wert als XML Element XML & JSON 2
J JCheckbox abfragen und serialisieren mit JAXB 2.0 XML & JSON 15
F JAXB erste schritte XML & JSON 6

Ähnliche Java Themen

Neue Themen


Oben