java - 使用 JAXB 生成的 XML 中的重复字段

标签 java xml jaxb jaxb2

这是我的场景。我有一个通用类:

public class Tuple<T> extends ArrayList<T> {
  //...
  public Tuple(T ...members) {
    this(Arrays.asList(members));
  }

  @XmlElementWrapper(name = "tuple")
  @XmlElement(name = "value")
  public List<T> getList() {
    return this;
  }
}

还有一个子类:

public class StringTuple extends Tuple<String> {
  public StringTuple(String ...members) {
    super(members);
  }

  //explanation of why overriding this method soon ...
  @XmlElementWrapper(name = "tuple")
  @XmlElement(name = "value")
  @Override
  public List<String> getList() {
    return this;
  }
}

这里引用了这些类:

@XmlRootElement(namespace = "iv4e.xml.jaxb.model")
public class Relation {
  private Tuple<StringTuple> relationVars;
  //...
  @XmlElementWrapper(name = "allRelationVars")
  @XmlElement(name = "relationVarsList")
  public Tuple<StringTuple> getRelationVars() {
    return relationVars;
  }
}

然后用类似的东西创建一个关系对象:

Relation rel = new Relation();
rel.setRelationVars(new Tuple<StringTuple>(
  new StringTuple("RelationshipVar1"), new StringTuple("RelationshipVar2")));

编码此对象后,Xml 输出如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:relation xmlns:ns2="iv4e.xml.jaxb.model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="">

  <allRelationVars>
    <relationVarsList>
        <tuple>
            <value xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">RelationshipVar1</value>
        </tuple>
        <tuple>
            <value>RelationshipVar1</value>
        </tuple>
    </relationVarsList>
    <relationVarsList>
        <tuple>
            <value xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">RelationshipVar2</value>
        </tuple>
        <tuple>
            <value>RelationshipVar2</value>
        </tuple>
    </relationVarsList>
  </allRelationVars>

</ns2:relation>

所以 value元素重复!

现在,类 StringTuple 覆盖 List<T> getList() 的原因与 List<String> getList()正在避免生成烦人的 xmlns:xs列表中每个成员的属性(xml 文档中的 value 元素)。 但是随后列表中的每个成员都会在输出中显示两次。看样子是因为重写的父方法和子方法都被注解了@XmlElement . 所以我的主要问题是:有一种方法可以忽略用 @XmlElement 注释的重写方法在贾克斯布? (考虑到覆盖方法也用 @XmlElement 注释)

我发现一个旧帖子报告了非常相似的问题:http://old.nabble.com/@XmlElement-on-overridden-methods-td19101616.html ,但我还没有找到任何解决方案。 另请注意,添加 @XmlTransient getList 的注释父类 ( Tuple<T> ) 中的方法可以解决这个问题,但会产生其他问题,因为父类不是抽象的,而是在其他上下文中单独使用。

一个次要问题:是否可以声明 xmlns:xs属性在根节点而不是它 - 烦人地 - 出现在每个需要它的节点?我知道这可以用 NamespacePrefixMapper 来完成类,但由于它是一个非标准的 SUN 内部类,我宁愿使用更独立于实现的方法。

提前感谢您的任何反馈!

最佳答案

这可能很旧,但它是搜索“JAXB 重复字段”时的第一个结果

偶然发现了同样的问题,这对我有用:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE) // <-- made the difference
public abstract class ParentClass
{
...
}


@XmlRootElement
public class ChildClass extends ParentClass
{
 ...
}

关于java - 使用 JAXB 生成的 XML 中的重复字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7851052/

相关文章:

java - Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

xml - Akka 远程 `system.shutdown()` 导致 EndpointDisassociatedException?

android - 如何在 Android 中的谷歌地图下方放置两个对齐的按钮

java - 如何记录契约(Contract)最后(通过 jaxb schemagen)web 服务?

java - 来自以 UTF-8 编码的 Java 解码文件的错误字符

java - 使用泛型返回动态 JAXBElement

java - Android 编程 - 发布 Google 表单/电子表格(必填)

java - 如何在 Eclipse MAT 中分析深层链接的对象

java - IllegalAccessError 仅适用于 AsyncTask 内的 Android 9

php - 在php中比较和过滤两个xml文件