如何在编组到xml时告诉jaxb截断BigDecimal?

时间:2011-09-21 10:09:02

标签: xsd jaxb bigdecimal

我有这两个类:

@XmlAccessorType(XmlAccessType.FIELD)
public class OpportunityLocation
{

    @XmlElement
    private LatitudeLongitude coordinates;
    [...]
}

public class LatitudeLongitude implements Serializable
{
    private BigDecimal latitude;
    private BigDecimal longitude;
    [...]
}

OpportunityLocation被序列化时,我得到了

<location>
    [...]
    <coordinates>
    <latitude>51.53684899999999657893567928113043308258056640625</latitude>
    <longitude>-0.1325880000000000114024345521102077327668666839599609375</longitude>
    </coordinates>

现在我被要求提供一个xsd来验证xml,我将latitudelongitude的类型设置为xsd:decimal但验证器抱怨

 Element 'latitude': '51.53684899999999657893567928113043308258056640625' is not a valid value of the atomic type 'xs:decimal'.

(经度相同)

描述坐标的xsd片段是

<xs:complexType name="latitudeLongitude">
    <xs:all>
        <xs:element name="latitude" type="xs:decimal"/>
        <xs:element name="longitude" type="xs:decimal"/>
    </xs:all>
</xs:complexType>

我认为最好的解决方案是截断纬度/经度值,因为首先没有必要提高精度。

我如何指示JAXB这样做?

2 个答案:

答案 0 :(得分:2)

或者只是使用BigDecimal.setScale()。如果适用于您的情况,则无需XmlAdapter。

BigDecimal bd = new BigDecimal((double) 1.2345);
bd = bd.setScale(2, RoundingMode.HALF_UP);

答案 1 :(得分:1)

您可以使用XmlAdapter执行此操作。下面是一个类似的例子,展示了Joda-Time类的概念: