JAXB:如何使JAXB不将空字符串解组为0

8

I have a DTO class with a field such as:

@XmlAttribute
@NotNull
private Integer number = null;

我将尝试解析类似以下的xml:

...  number=""  ...

我希望数字字段保持为空,这样就会抛出验证异常。但是JAXB将其解组为0。如何使其正确地运行?

1个回答

9
可以说,它的行为是正确的。"number =""并不意味着null,它是一个空字符串,JAXB必须尝试正确处理它,并决定整数数据类型最接近空字符串的东西是零。如果您想要一个null,则应完全省略number属性。
如果您想自定义此行为,您需要编写javax.xml.bind.annotation.adapters.XmlAdapter的子类,该子类可以处理原始字符串和绑定类型(即字符串和整数之间)之间的转换,以您想要的方式。然后通过在字段上注释@XmlJavaTypeAdapter来连接该适配器。

1
我完全不同意这是正确的行为。空字符串和整数之间没有隐式转换(例如,在这种情况下,Integer.parseInt("")会抛出NumberFormatException异常)。而且我并不想要一个null——我正在取消编组客户端输入,并且在省略数字属性或没有值的情况下返回的错误代码应该相同。 - RA.
2
@RA:你可能不同意,这很公平,但我也强烈反对认为空字符串是“没有值”。它一个值,是一个空字符串,并不等同于null。但无论我们中的任何人认为什么是“正确”的,最重要的是JAXB认为什么。 - skaffman
2
您可以使用模式验证来强制数值类型具有值:http://bdoughan.blogspot.com/2010/12/jaxb-and-marshalunmarshal-schema.html - bdoughan
1
@RA:为什么要抛出异常?如果输入的字符串为空,只需返回null-这不是你想要的吗? - skaffman
@RA,它适用于Long,但不适用于Integer。但两者都是相同的包装类。我不能使用适配器类,因为在适配器类内部,它变成了0而不是0。请在解决此问题后告诉我。 - deadend
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接