2010-09-05 42 views
3

目前,JAXB正在從我指定的xml模式創建一個點類。不過,我更喜歡它使用現有的java.awt.Point類。對於我定義的其他類型也使用和導入java.awt.Point。JAXB:將complexTypes設置爲使用現有的java類

這是我的一點代碼:

<xs:complexType name="point"> 
    <xs:sequence> 
    <xs:element name="x" type="xs:int" /> 
    <xs:element name="y" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 

這可能嗎?

回答

3

我不知道我的解決方案是否非常優雅,但我相信它可以滿足您的需求。

考慮Testjava.awt.Point類型的屬性p

@XmlRootElement 
public class Test { 
    @XmlElement 
    @XmlJavaTypeAdapter(PointAdapter.class) 
    public Point p; 
} 

PointAdapter如下:

class PointAdapter extends XmlAdapter<String, Point> { 

    @Override 
    public String marshal(Point v) throws Exception { 
     return String.format("%d;%d", v.x, v.y); 
    } 

    @Override 
    public Point unmarshal(String v) throws Exception { 
     String[] coords = v.split(";"); 
     return new Point(Integer.parseInt(coords[0]), Integer.parseInt(coords[1])); 
    } 

} 

如果不手動創建Java類,但讓他們通過xjc生成,也有可能在模式中指定XmlAdapter;或者通過一個單獨的綁定文件,您可以使用-b選項xjc指定或嵌入到XSD中。就我個人而言,我更喜歡第一個解決方案,因爲這可以保持模式清潔。由於我一直玩這個遊戲已經有一段時間了,我可以參考JAXB documentation(查找MyDatatypeConverter;這應該是最相關的部分)。

+0

謝謝!我會給它一個鏡頭。 – fli 2010-09-06 00:42:26