【问题标题】: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;这应该是最相关的部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多