当前位置: 首页 > 知识库问答 >
问题:

JAXB和复合模式

朱慈
2023-03-14

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

前提条件查询可以是:

  • 简单:只有一个包含查询的文本节点
  • 化合物
    • OR:1个前置条件查询的前置条件OR其他匹配
    • 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;
        }
    }
    

    对于化合物(化合物或前提条件查询基本相同):

    @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个答案

卢开济
2023-03-14

请尝试添加

@XmlSeeAlso({PreconditionQuery.class})

到您的CompoundAndPreoffictionQuery类。

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

另外,@XmlAccessorType要更加小心 - 有时你有它,有时没有。最好用它为包添加注释。

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

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

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

祝你好运,并致以最良好的祝愿。

 类似资料:
  • 继JAXB和复合模式之后,我设法映射: 但我想绘制: 我的JAXB类层次结构如下: 有几种类型的查询: 复合词(和/或)非常相似: 和封闭bean: JAXB不允许我只在上映射。为什么以及有什么替代方案?

  • 问题内容: 我必须设计一个数据模型(在Java EE 6应用程序中),该数据模型将通过JPA持久化,并且还需要通过JAXB进行序列化。上一次,我有一组带有JAXB批注的实体类,另一组带有JPA批注的实体类。这意味着我必须有很多样板代码才能在两者之间进行翻译。我正在考虑将它们组合在一起,以便每个类都具有两种类型的注释。我知道 可以 做到,但是我的问题是, 应该 吗?会引起什么问题吗? 问题答案: 这

  • 我正在尝试创建一个可以同时包含元素和值的java/jaxb类。 我想在A类的列表中读取一个类的属性,并作为A类本身的值输出。 这是XML: 我必须阅读: 并生产: 这是我的错误类-工作正常: 我的设备类别: Jaxb 抱怨我不能在同一类中同时拥有 xml 元素(错误 )和 xml 值 如何正确建模/注释此内容,以允许我读取 error xml 标记的属性并将其生成为设备标记的值?

  • 复合模式用于需要以与单个对象类似的方式处理一组对象的位置。 复合模式根据树结构组成对象,以表示部分以及整个层次结构。 这种类型的设计模式属于结构模式,因为此模式创建了一组对象的树结构。 此模式创建一个包含其自己的对象组的类。 此类提供了修改其相同对象组的方法。 我们通过以下示例演示复合模式的使用,其中我们将显示组织的员工层次结构。 实现 (Implementation) 我们有一个Employee

  • 这是我在PHP中的JSON构建代码,它在没有compositeTemplate部分的情况下工作,但是只要我添加了这个部分,就会出现一个错误。 信封不完整。一个完整的信封需要文档、收件人、标签和主题行。

  • 问题内容: 我正在尝试使用JAXB解组以下XML: 我已经使用XJC生成了所有类。如果要访问Composers集合,则必须执行以下操作: 有什么办法可以代替我吗? 我理解需要一个从XML派生的Composers对象,但是在使用Java进行交易时,拥有一个用于存储集合的中间POJO似乎有点多余。 我的XSD是: 问题答案: 该 @XmlElementWrapper 插件不正是你想要的。