2013-05-08 1 views
1

У меня есть класс @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; 
    } 
} 

ответ

1

Примечание: Я EclipseLink JAXB (MOXy) свинца и член группы экспертов JAXB (JSR-222).

Если вы используете MOXy в качестве поставщика JAXB, вы используете внешний файл привязки для переопределения суперкласса ваших типов.

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="forum116436770"> 
    <java-types> 
     <java-type name="StringList" super-type="java.lang.Object" /> 
    </java-types> 
</xml-bindings> 

Связанные Вопрос

Для получения более подробной информации

+1

Спасибо, я просто надеюсь, что я смог бы получить CXF (мой текущий провайдер JAX-WS), чтобы использовать Moxy в качестве поставщика JAXB. –