如何使用Scala选项[Float]取消/编组Float而不是使用JAXB的Java Float?

时间:2011-12-07 11:20:44

标签: scala jaxb

我在使用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的重要性?

2 个答案:

答案 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