2013-07-18 22 views
1

首先,爲長期問題道歉。XML如何綁定一個Apache Cayenne生成的類

我有一些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> 

回答

0

如果您需要序列化到XML只是形式的實體,沒有關係,你可以使用自定義類生成的模板。以下模板示例適用於Cayenne 3.1。

  1. here將所有內容複製創建一個超類模板,並添加JAXB註釋屬性節中的吸氣劑(循環開始「##創建屬性設置/ get方法」:您將需要一些自定義)。

  2. 在自定義sublcass template中,您可以添加引用超類的'getId'方法和'@XmlSeeAlso'註釋。當然,由於您可以更改子類,因此您可以手動添加這些子類,而不是自定義模板。 'getId'可能看起來像這樣:

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

  3. 然後爲您的類生成器(無論是Maven,Ant還是Modeler)選擇一個自定義模板。例如。爲Maven使用'superTemplate'參數。

現在,如果你需要更復雜的序列化(像我經常這樣做),其中包括各種關係,並從不同的要求,要求即使是同一個對象,JAXB註解太有限了點。您需要編寫一些上下文相關的JAXB編組器或JAX-RS MessageBodyWriter(如果您使用的是JAX-RS)。