我现在正在使用JAXB,我正在努力注释我的复合前提条件查询概念,以便JAXB会很高兴。
前置条件查询可以是:
当然,复合查询可以由复合查询组成,就像下面的例子一样:
<precondition>
<or>
<and>
<query>foo</query>
<query>bar</query>
</and>
<query>baz</query>
</or>
</precondition>
在我的Java模型中,我有一个单独的接口注释PreconditionQuery(实际上是一个抽象类,因为JAXB似乎对接口不满意)有3个实现SimplePreconditionQuery,CompoundOrPreconditionQuery和CompoundAndPreconditionQuery。
@XmlSeeAlso(PreconditionQuery.class)
@XmlRootElement(name = "query")
public class SimplePreconditionQuery extends PreconditionQuery {
private String query;
@XmlValue
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
}
对于复合的(CompoundOrPreconditionQuery基本相同):
@XmlSeeAlso(PreconditionQuery.class)
@XmlRootElement(name = "and")
public class CompoundAndPreconditionQuery extends PreconditionQuery {
private Collection<PreconditionQuery> preconditionQueries = newArrayList();
@XmlElementRef(name = "query")
public Collection<PreconditionQuery> getPreconditionQueries() {
return preconditionQueries;
}
public void setPreconditionQueries(Collection<PreconditionQuery> preconditionQueries) {
this.preconditionQueries = preconditionQueries;
}
}
最后,在封闭的bean级别,我映射如下:
public class Precondition {
private PreconditionQuery query;
@XmlElementRef(required = true)
public PreconditionQuery getQuery() {
return query;
}
public void setQuery(PreconditionQuery query) {
this.query = query;
}
}
最后,JAXB抱怨无法解决这个问题:
Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Invalid @XmlElementRef : Type "class xxx.PreconditionQuery" or any of its subclasses are not known to this context.
this problem is related to the following location:
at public xxx.PreconditionQuery xxx.Precondition.getQuery()
at xxx.Precondition
如果@XmlElementRef
不能胜任,那会是什么?
答案 0 :(得分:1)
请尝试添加
@XmlSeeAlso({PreconditionQuery.class})
到你的CompoundAndPreconditionQuery
班。
然后,尝试使用PreconditionQuery
注释所有@XmlRootElement
类/子类。
另外,对@XmlAccessorType
要小心一些 - 有时候你有,有时候没有。用它来更好地注释包。
最后,您可能需要ObjectFactory
@XmlRegistry
和@XmlElementDecl
,但我认为这绝对不是必需的。
我认为问题在于缺少@XmlRootElement
/ @XmlSeeAlso
注释。
@XmlElementRef
很棘手,但确实有效。 :)
祝你好运,祝福。