如何扩展JAXB生成的类,避免使用原始类型对数字使用对象?

时间:2017-07-05 18:10:56

标签: java xml xsd jaxb

我们的XSD包含使用默认值的位置类型。因此,生成的代码将使用Double包装器对象而不是原始double。遗憾的是,我们无法修改架构以保持API稳定。 现在我们想要实例化该类型的大量(> 10M)对象。但这会占用相对大量的RAM。因此,我们正在寻找一种使用原始double来避免包装器对象的方法。

我们的XSD部分:

<complexType name="Location">
    <attribute name="x" type="double" default="NaN"/>
    <attribute name="y" type="double" default="NaN"/>
</complexType>
<element name="Location" type="location:Location" />

生成的代码:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Location")
public class Location {

    @XmlAttribute(name = "x")
    protected Double x;
    @XmlAttribute(name = "y")
    protected Double y;

    public double getX() {
        if (x == null) {
            return java.lang.Double.NaN;
        } else {
            return x;
        }
    }

    public void setX(Double value) {
        this.x = value;
    }

    public double getY() {
        if (y == null) {
            return java.lang.Double.NaN;
        } else {
            return y;
        }
    }

    public void setY(Double value) {
        this.y = value;
    }
}

我们尝试扩展Location类,将它放在同一个包中但是在main而不是生成的源目录中:

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlType(name = "Location")
public class InternalLocation extends Location {

    @XmlAttribute(name = "x")
    private double x;

    @XmlAttribute(name = "y")
    private double y;

    public InternalLocation() {
    }

    public InternalLocation(double x, double y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public double getX() {
        return x;
    }

    @Override
    public double getY() {
        return y;
    }

    @Override
    public void setX(Double x) {
        // TODO null => NaN
        this.x = x;
    }

    @Override
    public void setY(Double y) {
        // TODO null => NaN
        this.y = y;
    }
}

但结果XML不包含x和y值:

<ns2:Location xmlns:ns2="http://test.com/location" x="1.0" y="2.0"/>

VS

<ns2:Location xmlns:ns2="http://test.com/location"/>

使用Marshaller

中的JAXBContext.newInstance("com.test.location");

我们可以做些什么来使用InternalLocation

  • JAXBContext
  • 的不同实例化
  • 覆盖注入com.test.location.Location$JaxbAccessorF_x

还是有其他方法可以避免包装器对象吗?

我应该提到一件重要的事情:我们希望在CXF Web服务中使用它,但CXF也在使用JAXB。

PS:我们不希望使用不同的数据表示来进行内部和外部使用。

PPS:我们只需要propper序列化(在服务器端)。我们不需要反序列化到InternalLocation(在客户端)。

0 个答案:

没有答案