Как сказать jaxb обрезать BigDecimal при сортировке в xml? - PullRequest
3 голосов
/ 21 сентября 2011

У меня есть два класса:

@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,Я установил тип latitude и longitude в xsd: десятичное, но валидатор жалуется, что

 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>

Я думаю, что лучшим решением было бы усечение значений lat / long, так как нет смысла иметь такую ​​высокую точность в первую очередь.

Как мне поручить JAXB делатьчто?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2016

Или просто используйте BigDecimal.setScale (). Нет необходимости в XmlAdapter, если это применимо к вашему делу.

BigDecimal bd = new BigDecimal((double) 1.2345);
bd = bd.setScale(2, RoundingMode.HALF_UP);
1 голос
/ 21 сентября 2011

Вы можете сделать это, используя XmlAdapter.Ниже приведен аналогичный пример, демонстрирующий концепцию с классами Joda-Time:

...