繁体   English   中英

使用JAXB解组列表 <String> -继承

[英]Using JAXB to unmarshal/marshal a List<String> - Inheritance

我建立了以下情况。 所有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>

我认为这与继承有关,但我不了解...

有什么问题? -我该如何解决?

提前致谢!

通过反射获得注释。 注释绑定到其定义的类型。

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")吗?

编辑

根据您的评论(但仍不确定我是否理解正确),我建议:

@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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM