gpt4 book ai didi

java - JAXB 和复合模式

转载 作者:太空宇宙 更新时间:2023-11-04 06:26:52 25 4
gpt4 key购买 nike

我现在正在使用 JAXB,并且正在努力注释前置条件查询的复合概念,以便 JAXB 满意。

前提条件查询可以是:

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

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

    <precondition>
<or>
<and>
<query>foo</query>
<query>bar</query>
</and>
<query>baz</query>
</or>
</precondition>

在我的 Java 模型中,我有一个带注释的接口(interface) PreconditionQuery(实际上是一个抽象类,因为 JAXB 似乎对接口(interface)不满意),具有 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 不能完成这项工作,那么什么可以?

最佳答案

请尝试添加

@XmlSeeAlso({PreconditionQuery.class})

到您的CompoundAndPreconditionQuery 类。

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

此外,使用 @XmlAccessorType 时要更加小心 - 有时有,有时没有。最好用它来注释包。

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

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

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

关于java - JAXB 和复合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26682591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com