JAXB和复合模式

时间:2014-10-31 20:03:01

标签: java xml jaxb composite

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

前置条件查询可以是:

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

当然,复合查询可以由复合查询组成,就像下面的例子一样:

    <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不能胜任,那会是什么?

1 个答案:

答案 0 :(得分:1)

请尝试添加

@XmlSeeAlso({PreconditionQuery.class})

到你的CompoundAndPreconditionQuery班。

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

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

最后,您可能需要ObjectFactory @XmlRegistry@XmlElementDecl,但我认为这绝对不是必需的。

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

众所周知,{p> @XmlElementRef很棘手,但确实有效。 :)

祝你好运,祝福。