1

我有一个扩展 ParentClass 的类(ChildClass)。解组时,我从 setPropFromElementList() 中得到一个异常,即我传入的值在列表中不存在,即使它确实存在于列表中。我相信问题是由 JAXB 在设置子元素之前尝试设置父属性引起的。

我看到各种博客文章和问题,建议将父类设为 Transient,然后在子类上使用 propOrder(也包括父类中的元素)。这对我没有帮助 - 我收到了 IllegalAnnotationException。

有任何想法吗?(示例代码如下——它不是我使用的确切代码,所以我不能 100% 确定它会编译。但是,它确实显示了我在真实代码中所做的事情。)

父类.java

@XmlTransient //on the entire class - not shown here

private String propFromElementList

@XmlAttribute
String getPropFromElementList() {
    return this.propFromElementList;
}

void setPropFromElementList(String value) {
    checkThatValueIsInList(value);
    this.propFromElementList = value;
}

protected abstract void checkThatValueIsInList(String value);

ChildClass.java 扩展了 ParentClass

@XmlType(propOrder={ "list", "propFromElementList" })

private String[] list;

@XmlElement
public String[] getList() {
    return this.list;
}

public void setList(final String... list) {
    this.list = list;
}

@Override
protected void checkThatValueIsInList(String value) {
    //search for String and throw RuntimeException if not found
}

XML

<child propFromElementList="A">
    <list>A B C D</list>
</child>
4

1 回答 1

0

更新

有没有办法确保在使用继承时将我的 jaxb 元素设置在属性之前?

您无法控制JAXB (JSR-222)实现填充域模型的顺序。JAXB impl 最喜欢填充对象模型,因为它在解组操作期间执行 XML 文档的深度优先遍历。这意味着属性通常会在任何子元素之前处理,这似乎是导致用例中问题的原因。

您可能需要考虑将验证逻辑移到setPropFromElementList方法之外并将其放入afterUnmarshal方法中。


原始答案

上的propOrder设置@XmlType仅在编组时使用。您不能在propOrderon中包含使用 @XmlAttribute 映射的属性@XmlType。既然你有:

@XmlAttribute
String getPropFromElementList() {
    return this.propFromElementList;
}

propFromElementList不能出现在propOrder其中仅针对非属性节点。

于 2013-03-06T20:04:43.040 回答