1

首先,为这个冗长的问题道歉。

我有许多由 Cayenne 生成的类,如下所示。

public abstract class _Form extends CayenneDataObject {

    public static final String NAME_PROPERTY = "name";
    public static final String FORM_ELEMENT_PROPERTY = "formElement";
    public static final String FORM_ELEMENT1_PROPERTY = "formElement1";
    public static final String FORM_ELEMENT2_PROPERTY = "formElement2";

    public static final String ID_PK_COLUMN = "ID";

    public void setName(String name) {
        writeProperty("name", name);
    }
    public String getName() {
        return (String)readProperty("name");
    }

    public void addToFormElement(FormElement obj) {
        addToManyTarget("formElement", obj, true);
    }
    public void removeFromFormElement(FormElement obj) {
        removeToManyTarget("formElement", obj, true);
    }
    @SuppressWarnings("unchecked")
    public List<FormElement> getFormElement() {
        return (List<FormElement>)readProperty("formElement");
    }
}

我希望将其转换为 XML 模式,最好使用绑定表示法。首先要注意的是上面的代码是一个“_Form.java”文件,但还有一个生成的“Form.java”文件扩展了这个类,如下所示。我知道不应更改“_Form.java”(上图)。

import forms.cayenne.persistent.auto._Form;

public class Form extends _Form {

}

本质上,我希望将它和其他一些类转换为 XML,就像我在下面这个简单的类示例中所做的那样,使用 xml 绑定。

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Form")
public class Form {

    String name;
    long ID;

    @XmlElement
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlAttribute
    public long getID() {
        return ID;
    }

    public void setID(long formID) {
        this.ID = formID;
    }
}

我应该对生成的类进行哪些更改以生成以下 XML?

<Form id="1">
    <name>test</name>
</Form>
4

1 回答 1

0

如果您只需要将 Form 实体序列化为 XML,而没有任何关系,则可以使用自定义类生成器模板。以下模板示例适用于 Cayenne 3.1。您将需要的一些自定义项:

  1. 通过从此处复制所有内容来创建超类模板,并将 JAXB 注释添加到属性部分中的 getter(以“## Create attribute set/get methods”开头的循环)。

  2. 在自定义sublcas 模板中,您可以添加引用超类的“getId”方法和“@XmlSeeAlso”注释。当然,由于您可以更改子类,因此您可以手动添加它们,而不是自定义模板。“getId”可能如下所示:

    public int getId() { return Cayenne.intPKForObject(this); }

  3. 然后为您的类生成器选择一个自定义模板(无论是 Maven、Ant 还是 Modeler)。例如对于Maven使用 'superTemplate' 参数。

现在,如果您需要更复杂的序列化(就像我经常做的那样),其中包括各种关系,并且即使对于同一个对象也因请求而异,那么 JAXB 注释太有限了。您将需要编写一些上下文相关的 JAXB 编组器或 JAX-RS MessageBodyWriter(如果您使用的是 JAX-RS)。

于 2013-07-19T06:26:10.877 回答