我将项目从JAXB 1.0迁移到JAXB 2.1,并且我在数据类型映射方面遇到问题.
我正在使用Ant xjc绑定编译器,并且我已经成功配置了全局绑定,以便(例如)xs:date映射到java.util.Calendar.
然而,我正在生成返回Boolean的方法,我想要布尔值.
这是复杂的类型:
<xs:element name="usage-auth-rate-charge"> <xs:complexType> <xs:sequence> <xs:element name="service-id" type="xs:string"/> <xs:element name="pricepoint_custom_fields_required" type="xs:boolean" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>
生成的类看起来像这样:
public class UsageAuthRateCharge { ........ public Boolean isPricepointCustomFieldsRequired() { return pricepointCustomFieldsRequired; }
问题是尽管拳击将会起作用,如果提供的XML不包含pricepoint_custom_fields_required的值,则该类的布尔字段为null而不是false.所以我在做这样的事情时得到NullPointerExceptions:
methodWhichTakesPrimitiveBooleanArg(myUsageAuthRateChargeInstance.isPricepointCustomFieldsRequired());
因为它尝试解除传入的布尔值 – 除非它为空.
我无法更改模式,我无法调整所有客户端代码进行空检查.
我已经在我的binding.xml中设置了OptionalProperty属性,如下所示:
<globalBindings optionalProperty="primitive">
在规范中,它说:“如果属性的值是”原始的“,那么它就像在JAXB 1.0”
然而这显然没有发生.
如何解决这个问题?
更新:
现在已经在jaxb 2.2.9中修复了:
https://java.net/jira/browse/JAXB/fixforversion/16850问题
你得到Boolean而不是boolean的原因是你的元素定义中有minOccurs =“0”.将为缺少的元素存储空值.
<xs:element name="pricepoint_custom_fields_required" type="xs:boolean" minOccurs="0"/>
解决方案应该是什么
该解决方案应该是一个外部绑定文件,它指示一个基本类型应该用于可选的值(参见JAXB 2.2规范的7.5.1).
<?xml version="1.0" encoding="UTF-8"?> <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <jaxb:globalBindings optionalProperty="primitive"/> </jaxb:bindings>
外部绑定文件使用XJC的-b选项指定.
xjc -b binding.xml my-schema.xsd
为什么解决方案不起作用
已经打开以下错误以跟踪optionalProperty =“primitive”的问题.
> https://java.net/jira/browse/JAXB-510
> https://java.net/jira/browse/JAXB-926
解决方法
如果您不喜欢在JAXB中生成类的方式,那么您可以自己创建一个类,并将JAXB作为模式的一部分将其作为类生成.
binding.xml
<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <jxb:bindings schemaLocation="my-schema.xsd"> <jxb:bindings node="//xs:element[@name='usage-auth-rate-charge']/complexType"> <jxb:class ref="com.example.foo.UsageAuthRateCharge"/> </jxb:bindings> </jxb:bindings> </jxb:bindings>
UsageAuthRateCharge
用你想要的方法创建这个类.
XJC电话
使用XJC调用上的-b标志来指定binding.xml文件
xjc -b binding.xml my-schema.xsd
UPDATE
What I was really hoping was that one of the readers might be a jaxb dev team member who could do the change easily in jaxb. User archenroot offered a possible solution in his comments on jaxb issue 927 (a duplicate of 926) which leads me to think that for the right person, it would be a simple job to fix jaxb
我是 EclipseLink JAXB (MOXy) 领先.我已经接触到JAXB参考实现的同事(他们也适用于Oracle).以下是我从他们那里得到的答复:
I’ve tested in trunk – and the problem exists. I’ll check code how easy is to fix it.
希望你能够得到一个真正的解决这个问题.
代码日志版权声明:
翻译自:http://stackoverflow.com/questions/13035975/jaxb-compiler-is-binding-xsboolean-to-java-boolean-wrapper-class-instead-of-bo