Использование JAXB для демаршалирования / маршалирования List <String>- Наследование - PullRequest
4 голосов
/ 15 марта 2010

Я построил следующий случай. Интерфейс для всех JAXBLists:

public interface JaxbList<T> {
public abstract List<T> getList();
}

И базовая реализация:

@XmlRootElement(name="list")
public class JaxbBaseList<T> implements JaxbList<T>{
    protected List<T> list;

    public JaxbBaseList(){}

    public JaxbBaseList(List<T> list){
        this.list=list;
    }

    @XmlElement(name="item" )
    public List<T> getList(){
        return list;
    }
}

А также реализация списка URI:

@XmlRootElement(name="uris")
public class JaxbUriList2 extends JaxbBaseList<String> {

    public JaxbUriList2() { super();    }
    public JaxbUriList2(List<String> list){
        super(list);
    }


    @Override
    @XmlElement(name="uri")
    public List<String> getList() {
        return list;
    }
}

И я использую Список следующим образом:

public JaxbList<String> init(@QueryParam("amount") int amount){

        List<String> entityList = new Vector<String>();
        ...
        enityList.add("http://uri");
    ...
        return new JaxbUriList2(entityList);
    }

Я думал, что вывод должен быть:

<uris>
<uri>
http://uri
</uri>
...
</uris>

Но это что-то вроде этого:

<uris>
<item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">
http://uri
</item>
...
<uri>
http://uri
</uri>
...
</uris>

Я думаю, что это как-то связано с наследованием, но я не понимаю ...

В чем проблема? - Как я могу это исправить?

Заранее спасибо!

1 Ответ

2 голосов
/ 15 марта 2010

Аннотации получены путем отражения. Аннотация связана с типом, в котором она определена.

public class AnnotationTest {

    public static class A
    {
        @XmlElement(name="item")
        public void doIt() { }
    }

    public static class B extends A
    {
        @XmlElement(name="name")
        public void doIt() { }
    }

    public static void main(String[] args)
    {
        B b = new B();
        Method m = b.getClass().getMethods()[0];
        Annotation[] ann =  m.getDeclaredAnnotations();
        System.out.println( ann.length  );  // prints 1
    }
}

Так что это поведение не связано с самим механизмом отражения. Кажется, что среда JAXB явно перечисляет аннотацию метода в классе и суперклассах. Удивительно, но это все еще работает, но не так, как хотелось бы.

Разве вы не можете просто удалить @XmlElement(name="item") в базовом классе?

EDIT

Согласно вашему комментарию (но все еще не уверен, правильно ли я все понимаю), я бы предложил:

@XmlRootElement(name="list")
public class JaxbBaseList<T> implements JaxbList<T>{
    protected List<T> list;

    public List<T> getList(){
        return list;
    }
}


public class JaxbPrimitiveList<T> extends JaxbList<T>{
    protected List<T> list;

    @XmlElement( name="item" )
    public List<T> getList(){
        return list;
    }
}

@XmlSeeAlso( Uri )
public class JaxbUriList<Uri> extends JaxbList<Uri>{
    protected List<Uri> list;

    @XmlElement( name="uri" )
    public List<Uri> getList(){
        return list;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...