Как отключить / маршалировать Float как опцию Scala [Float], а не Java Float с JAXB? - PullRequest
3 голосов
/ 07 декабря 2011

У меня проблема с использованием JAXB в Scala для маршалинга и демаршаллинга (и целых чисел в этом отношении).

В моем приложении Scala есть переменные, подобные этой:

val taxPaid: Option[Float]

Если taxPaid равен 0.0f, это означает, что налог не уплачивается; если taxPaid равен None, то это означает, что мы не знаем, сколько было уплачено налога.

Переменная типа Option[Float] отлично отображается в столбце SQL float NULL (я использую Squeryl), и в равной степени она может быть хорошо выражена в JSON или XML. У меня проблема с JAXB - чтобы заставить JAXB работать, в моих представлениях POJO я должен использовать простую Java Floats, например:

@XmlElement(nillable = true, `type` = classOf[Object])
@BeanProperty
var taxPaid: Float = _

И затем, поскольку Java Float не может принимать значение null, значение 0.0f рассматривается как (неверный и с потерями) прокси для null.

Итак, мой вопрос: есть ли способ, которым я могу маршалировать и демаршировать XML-плавающие в Scala Option[Float], и таким образом сохранять значение null?

Ответы [ 2 ]

1 голос
/ 09 февраля 2015

На случай, если кто-то еще задумывается, есть также возможность использовать адаптер, чтобы вам не приходилось иметь дело с нулями в вашем коде. Вам нужно будет предоставить реализацию XmlAdapter. Есть парень, который написал об этом в блоге: http://krasserm.blogspot.com.ar/2012/02/using-jaxb-for-xml-and-json-apis-in.html

1 голос
/ 07 декабря 2011
Комментарий

Ingo направил меня в правильном направлении - проблема в том, что Scala Float нельзя установить на null (предположительно, для поощрения идиоматического использования None), тогда как Java Float может:

scala> val nf:java.lang.Float = null
nf: java.lang.Float = null

scala> val nf:Float = null
<console>:7: error: type mismatch;
 found   : Null(null)
 required: Float
Note that implicit conversions are not applicable because they are ambiguous:
 both method Float2floatNullConflict in class LowPriorityImplicits of type (x:     Null)Float
 and method Float2float in object Predef of type (x: java.lang.Float)Float
 are possible conversion functions from Null(null) to Float
       val nf:Float = null
                      ^

Таким образом, ответ - просто убедиться, что мои представления явно используют Java Floats:

import java.lang.{Float => JFloat}

@XmlElement(nillable = true, `type` = classOf[Object])
@BeanProperty
var taxPaid: JFloat = _
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...