我在使用Scala中的JAXB进行编组和解组浮动(以及整数)时遇到问题。
在我的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
的重要性?
答案 0 :(得分:1)
Ingo 的评论引导我朝着正确的方向前进 - 问题是Scala Float
无法设置为null
(可能是为了鼓励惯用法None
1}}),而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 = _
答案 1 :(得分:1)
万一有其他人想知道,还有使用适配器的选项,因此您不必处理代码中的空值。您需要提供XmlAdapter的实现。有一个人写博客:http://krasserm.blogspot.com.ar/2012/02/using-jaxb-for-xml-and-json-apis-in.html