2013-03-06 71 views
1

我有一个父类扩展一个类(ChildClass)。当解读时,我正在从setPropFromElementList(),我传递的价值并不在列表中存在,即使它在列表中确实存在异常。我相信这个问题是由JAXB在设置子元素之前尝试设置父元素的属性引起的。有没有办法确保在使用继承时我的jaxb元素设置在属性之前?

我看到了各种博客帖子和问题,建议使父类Transient,然后对子类(包括父类的元素)使用propOrder。这并没有帮助我 - 我得到了IllegalAnnotationException。

任何想法? (示例代码如下 - 它不是我使用的精确代码,所以我不能100%确定它会编译。但是,它确实显示了我在我的实际代码中所做的操作。)

ParentClass。的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延伸父类

@XmlType(propOrder = { “列表”, “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> 

回答

0

UPDATE

有没有一种方法,以确保我的JAXB元素的属性之前,使用继承时设置?

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

您可能需要考虑将验证逻辑移至setPropFromElementList方法之外,并将其置于afterUnmarshal方法中。


原来的答案

@XmlTypepropOrder设定编组时才使用。您不能在@XmlTypepropOrder中包含使用@XmlAttribute映射的属性。既然你有:

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

然后propFromElementList不能出现在propOrder后者只适用于非属性节点。

+0

那么有什么方法可以确保元素在属性之前设置? – chama 2013-03-06 20:05:14

+0

@chama - 我已经更新了我的答案。 – 2013-03-06 20:11:13

相关问题