Hallo,
bin nach verzweifelter suche nun hier gelandet und hoffe, dass mir mit meinem problem geholfen werden kann...
da ich gerne JAXB als framework verwenden würde, hänge ich nun bei folgendem fest:
es gibt ein interface, eine implementierung dessen und eine klasse mit einer collection des interfaces, das soll nach xml serialisiert werden.
erste ansatz (unofficial jaxb guide):
gibt folgende exception:
zweiter ansatz nach ein wenig goggeln:
adapter klasse implementiert
... und die anderen klassen entsprechend annotiert
die marshal-methode des adapters wird auch ausgeführt, allerdings kommt es zu folgendem
ergebnis:
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
<animals name="Clarence"/>
</zoo>
[/XML]
erwartet wäre allerdings nicht animals sonder lion, also
[XML]
...
<lion name="Clarence"/>
...
[/XML]
bin für jede hilfe dankbar
,
mfg,
christian
bin nach verzweifelter suche nun hier gelandet und hoffe, dass mir mit meinem problem geholfen werden kann...
da ich gerne JAXB als framework verwenden würde, hänge ich nun bei folgendem fest:
es gibt ein interface, eine implementierung dessen und eine klasse mit einer collection des interfaces, das soll nach xml serialisiert werden.
erste ansatz (unofficial jaxb guide):
Java:
public interface Animal
{
String getName();
}
Java:
@XmlRootElement
public class Lion implements Animal
{
private String name = "Clarence";
@XmlAttribute
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Java:
@XmlRootElement
public class Zoo
{
@XmlElement
public List<Animal> animals = new ArrayList<Animal>();
public static void main(String[] args)
{
final Zoo zoo = new Zoo();
zoo.animals.add(new Lion());
JAXB.marshal(zoo, System.err);
}
}
gibt folgende exception:
Java:
Exception in thread "main" javax.xml.bind.DataBindingException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
test.jaxb.Animal is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at test.jaxb.Animal
at public java.util.List test.jaxb.Zoo.animals
at test.jaxb.Zoo
test.jaxb.Animal does not have a no-arg default constructor.
this problem is related to the following location:
at test.jaxb.Animal
at public java.util.List test.jaxb.Zoo.animals
at test.jaxb.Zoo
usw...
zweiter ansatz nach ein wenig goggeln:
adapter klasse implementiert
Java:
public class XmlLionAdapter extends XmlAdapter<Lion, Animal>
{
@Override
public Animal unmarshal(Lion v) throws Exception {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Lion marshal(Animal v) throws Exception {
System.err.println(getClass().getSimpleName() + ": " + v.getClass());
return (Lion) v;
}
}
... und die anderen klassen entsprechend annotiert
Java:
@XmlJavaTypeAdapter(value=XmlLionAdapter.class) //<=== added
public interface Animal
{
String getName();
}
Java:
@XmlRootElement
public class Zoo
{
@XmlElement
@XmlJavaTypeAdapter(value=XmlLionAdapter.class) //<=== added
public List<Animal> animals = new ArrayList<Animal>();
public static void main(String[] args)
{
final Zoo zoo = new Zoo();
zoo.animals.add(new Lion());
JAXB.marshal(zoo, System.err);
}
}
die marshal-methode des adapters wird auch ausgeführt, allerdings kommt es zu folgendem
ergebnis:
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
<animals name="Clarence"/>
</zoo>
[/XML]
erwartet wäre allerdings nicht animals sonder lion, also
[XML]
...
<lion name="Clarence"/>
...
[/XML]
bin für jede hilfe dankbar
mfg,
christian