I have a @XmlTransient
class called ListBase<T>
which implements List<T>
. I then subclass that list into @XmlType StringList
, @XmlType PersonList
, etc.
It seems that JAXB treats such classes in a special way, such as when an instance of that class is a member of some other class, then that member gets marshaled as
<xs:element maxOccurs="unbounded" type="whatever the type of T" .../>
instead of
<xs:element type="type of my list implementor" .../>`
that is, the contents of the list gets marshaled instead of the list itself.
The class ListBase<T>
implements List<T>
by encapsulation, i.e. it has a field of type List<T>
and it exposes that field through accessors marked as @XmlElement
so that the inner list gets marshaled with the type. If I remove implements List<T>
from my list implementor then I get the second (desired) variant but that means modifying rest of the application so that it's aware of encapsulation.
How can I disable special treatment of my List implementor such that it gets marshaled as any other non-collection complex type?
@XmlTransient
public abstract class ListBase<T> implements List<T> {
protected List<T> list;
public ListBase(List<T> list) {
this.list = list;
}
public ListBase() {
this(new ArrayList<T>());
}
public abstract List<T> getList();
public abstract void setList(List<T> value);
//The rest is List<T> implementation using encapsulation of this.list
//...
}
@XmlType(name = "ArrayOfstring", namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
@XmlAccessorType(XmlAccessType.NONE)
public class StringList extends ListBase<String> {
public StringList(List<String> list) {
super(list);
}
public StringList() {
super();
}
@XmlElement(name = "string")
public List<String> getList() {
return list;
}
public void setList(List<String> value) {
this.list = value;
}
}
Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.
If you are using MOXy as your JAXB provider then you leverage the external binding file to override the super class of your types.
Related Question
For More Information