gpt4 book ai didi

java - 使用 JAXB 解码/编码 List - 继承

转载 作者:搜寻专家 更新时间:2023-11-01 03:30:11 24 4
gpt4 key购买 nike

我构建了以下案例。所有 JAXBLists 的接口(interface):

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>

我觉得跟继承有关系,但是我不明白...

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

提前致谢!

最佳答案

注解是通过反射获得的。注释绑定(bind)到它定义的类型。

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 框架确实明确列出了类 父类(super class)中方法的注释。令人惊讶的是,这仍然有效,但不是您想要的那样。

你不能只删除基类中的 @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;
}
}

关于java - 使用 JAXB 解码/编码 List<String> - 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2446532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com