JAXB:设置complexTypes以使用现有java类
目前,JAXB正在根据我指定的xml模式创建一个point类。但是,我更希望它使用现有的java.awt.Point类。对于我定义的任何其他类型,也要使用和导入java.awt.Point 以下是我的要点代码:JAXB:设置complexTypes以使用现有java类,java,xml,xsd,schema,jaxb,Java,Xml,Xsd,Schema,Jaxb,目前,JAXB正在根据我指定的xml模式创建一个point类。但是,我更希望它使用现有的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:i
<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.awt.Point的属性p
的类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]));
}
}
class PointAdapter扩展了XmlAdapter{
@凌驾
公共字符串封送处理(第v点)引发异常{
返回字符串.format(“%d;%d”,v.x,v.y);
}
@凌驾
公共点解组(字符串v)引发异常{
字符串[]坐标=v.split(“;”);
返回新的点(Integer.parseInt(coords[0]),Integer.parseInt(coords[1]);
}
}
如果您不是手工创建Java类,而是让它们通过xjc
生成,那么也可以在模式中指定XmlAdapter
;通过一个单独的绑定文件,可以使用xjc
的-b
选项指定该文件,也可以嵌入到XSD中。就个人而言,我更喜欢第一种解决方案,因为这样可以保持模式的干净。因为我已经玩了一段时间了,所以我建议您使用(寻找MyDatatypeConverter;这应该是最相关的部分)