【问题标题】:JAXB: setting complexTypes to use existing java classesJAXB:设置 complexTypes 以使用现有的 java 类
【发布时间】:2010-09-05 21:42:05
【问题描述】:
目前,JAXB 正在从我指定的 xml 模式创建一个点类。但是,我希望它使用现有的 java.awt.Point 类。对于我定义的任何其他类型,也可以使用和导入 java.awt.Point。
这是我的点代码:
<xs:complexType name="point">
<xs:sequence>
<xs:element name="x" type="xs:int" />
<xs:element name="y" type="xs:int" />
</xs:sequence>
</xs:complexType>
这可能吗?
【问题讨论】:
标签:
java
xml
xsd
schema
jaxb
【解决方案1】:
我不知道我的解决方案是否非常优雅,但我相信它可以满足您的要求。
考虑具有p 类型为java.awt.Point 的属性的类Test:
@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;通过单独的绑定文件,您可以使用 xjc 的 -b 选项指定或嵌入到 XSD 中。我个人更喜欢第一个解决方案,因为这可以保持架构干净。自从我玩这个已经有一段时间了,我推荐你到JAXB documentation(寻找MyDatatypeConverter;这应该是最相关的部分)。