JAXB和复合模式

我现在正在使用JAXB,我正在努力注释我的前置条件查询的复合概念,以便JAXB会很高兴。

前提条件查询可以是:

  • simple:只包含查询的文本节点
  • 复合
    • OR:1个前提条件查询或其他匹配的前提条件
    • AND:1个前置条件查询和其他匹配的前提条件

当然,复合查询可以由复合查询组成,就像在以下示例中一样:

   foo bar  baz   

在我的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 preconditionQueries = newArrayList(); @XmlElementRef(name = "query") public Collection getPreconditionQueries() { return preconditionQueries; } public void setPreconditionQueries(Collection 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不能完成这项工作,会是什么?

请尝试添加

 @XmlSeeAlso({PreconditionQuery.class}) 

到您的CompoundAndPreconditionQuery类。

然后,尝试使用@XmlRootElement注释所有PreconditionQuery类/子类。

另外,对@XmlAccessorType要小心@XmlAccessorType – 有时候你有它,有时候没有。 用它来更好地注释包。

最后,您可能需要一个带有@XmlRegistry@XmlElementDeclObjectFactory ,但我不认为它是绝对必需的。

我认为问题是缺少@XmlRootElement / @XmlSeeAlso注释。

已知@XmlElementRef很棘手,但确实有效。 🙂

祝你好运,祝福。