Как заставить JAXB разобрать научную нотацию для BigInteger? - PullRequest
4 голосов
/ 30 января 2012

Я новичок, когда дело доходит до JAXB и маршаллинга / демаршаллинга, и я изо всех сил пытался, чтобы все заработало.

Пока что я написал свои XSD и сгенерировал свои POJO.используя xjc.Все это прекрасно работает.Кроме того, когда мне нужно удалить данные, поступающие в виде данных String или документа w3c, я использую JAXBContext.generateSchema () , чтобы создать схему сопоставления, относящуюся к ожидаемому классу, который я получаю.Все это прекрасно работает.

Моя проблема возникает, когда я анализирую схему, которую генерирует generateSchema ().Согласно JAXB документам , BigDecimal генерируется как десятичный тип xsd.

Мой ввод иногда содержит научную запись (например, 1.12E12).Когда я пытаюсь разобрать это с помощью схемы, сгенерированной JAXB, я получаю исключение javax.xml.bind.UnmarshalException:

[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: '1.32400146520976E-4' is not a valid value for 'decimal'.]

Есть ли какой-то способ правильно проанализировать научную нотацию при использовании типа «десятичный»или это должно быть "double"?

Первоначально я думал, что мог бы использовать двойное представление, поскольку double может анализировать научную нотацию, однако я имею дело с финансовыми значениями (это для банковских расчетов) и, следовательно, японял, что использование двойного представления приведет к ошибкам округления из-за присущих ему ограничений.

Итак, я думаю, что возникает вопрос, как создать пользовательские привязки, которые позволили бы мне анализировать научные записи и сохранять данные в BigDecimal?Я посмотрел на XMLAdpater, но я не понимаю, как использовать его для рассматриваемого случая.Если кто-то может предоставить понимание или пример (кроме вездесущего примера Карты, который я постоянно нахожу в Интернете), я был бы очень признателен.

Спасибо!

Эрик

1 Ответ

2 голосов
/ 31 января 2012

1) Без пользовательских привязок, НЕТ, поскольку спецификация XML-схемы довольно ясно показывает, что такое лексическое представление десятичного числа .

2) Я думаю, что настройка - единственный способ преодолеть это; другой путь, может быть ?

Однако меня может беспокоить то, что если кто-то попытается использовать сгенерированный XSD для проверки экземпляров XML, то это время от времени не получится, если у вас нет схемы, которая допускает оба варианта ... Хотя избегают , xsd: union может быть единственным выходом (вам все равно придется сделать пользовательскую привязку) ...

...