JAXB编译器将xs:boolean绑定到Java布尔包装类,而不是布尔基本类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

我将项目从JAXB 1.0迁移到JAXB 2.1,并遇到数据类型映射问题。

我正在使用Ant xjc绑定编译器,并且已成功配置全局绑定,以便(例如)xs:date映射到java.util.Calendar

不过,我得到生成的方法返回布尔值,我想要布尔值。

这是复杂的类型:

<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,则该类的布尔字段为空,而不是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

提问于
用户回答回答于

尝尝这个。

<xs:element name="usage-auth-rate-charge">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="service-id" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="chosen" type="xs:boolean" use="required"/>
    </xs:complexType>
</xs:element>

我发现了你的问题,因为我正在寻找如何做完全相反的事情你在做。我有一个布尔属性,它只生成将该属性作为原始布尔值的代码。为了使jaxb将该属性生成为一个布尔对象而不是布尔原语,我刚刚删除了xsd中属性定义的use=“Required”部分。

用户回答回答于

你得到的原因Boolean而不是boolean是你有minOccurs="0"在元素定义中。阿null值将存储在缺少的元素中。

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

外部绑定文件使用-b选项与XJC。

xjc -b binding.xml my-schema.xsd

为什么那个解决方案不起作用?

已打开以下bug以跟踪optionalProperty="primitive"...

如果您不喜欢在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呼叫

使用-b标记在XJC调用中指定binding.xml档案

xjc -b binding.xml my-schema.xsd
我真正希望的是,其中一个读者可能是jaxbdev团队成员,他可以轻松地在jaxb中完成更改。User archenroot在他对jaxb问题927(926的复制)的评论中提供了一个可能的解决方案,这使我认为对于正确的人来说,修复jaxb是一项简单的工作。

我是EclipseLink JAXB(Moxy)铅。我已经联系了我的同事,他们做JAXB参考实现(他们也为Oracle工作)。以下是我从他们那里得到的答复:

我在后备箱里做过测试,但问题还是存在的。我将检查代码是多么容易修复它。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励