У меня есть класс @XmlTransient
под названием ListBase<T>
, который реализует List<T>
. Я тогда подклассы этот список в @XmlType StringList
, @XmlType PersonList
и т.д.Отключить специальную обработку списка <T> Реализация во время маршалинга JAXB
кажется, что JAXB лечит такие классы особым образом, например, когда экземпляр этого класса является членом какого-либо другого класса, то этот член получает выстраивали в
<xs:element maxOccurs="unbounded" type="whatever the type of T" .../>
вместо
<xs:element type="type of my list implementor" .../>`
, то есть содержимое списка получает выстраивали вместо самого списка.
Класс ListBase<T>
реализует List<T>
пути капсулирования, то есть он имеет поле типа List<T>
и выставляет это поле через аксессор помечен как @XmlElement
так, что внутренний список получает маршалируются с типом. Если я удалю implements List<T>
из своего разработчика списка, тогда я получу второй (желательный) вариант, но это означает изменение остальной части приложения, чтобы он знал об инкапсуляции.
Как я могу отключить специальную обработку моего реализатора списка таким образом, чтобы он был маршалирован, как и любой другой комплекс, не относящийся к коллекции?
@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;
}
}
Спасибо, я просто надеюсь, что я смог бы получить CXF (мой текущий провайдер JAX-WS), чтобы использовать Moxy в качестве поставщика JAXB. –