当前位置: 首页 > 知识库问答 >
问题:

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

洪鸿
2023-03-14

我正在将一个项目从JAXB 1.0迁移到JAXB 2.1,我在数据类型映射方面遇到了问题。

我正在使用蚂蚁xjc绑定编译器,并且我已经成功地配置了全局绑定,以便(例如)xs: date映射到java.util.日历。

然而,我得到的生成方法返回布尔,而我想要布尔

这里是复杂类型:

<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\u custom\u fields\u required的值,则类的布尔字段为null,而不是false。因此,在执行以下操作时,会出现NullPointerException:

methodWhichTakesPrimitiveBooleanArg(myUsageAuthRateChargeInstance.isPricepointCustomFieldsRequired());

因为它试图取消传递的布尔值的装箱-除非它为null。


我无法更改模式,也无法调整所有html" target="_blank">客户端代码以执行空检查。

我在binding.xml中设置了optionalProperty属性如下:

<globalBindings optionalProperty="primitive">

在规范中,它说:“如果属性的值是“primitive”,它将像在JAXB 1.0中一样绑定”

然而,这显然没有发生。

我怎样才能解决这个问题?

更新:

这在jaxb 2.2.9中已经修复:https://java.net/jira/browse/JAXB/fixforversion/16850

共有3个答案

戎桐
2023-03-14

只是为了让它完整

type="xs:boolean" minOccurs="0" maxOccurs="1"                   == Boolean value (object)

type="xs:boolean" minOccurs="0" maxOccurs="1" nillable="true"   == JAXBElement<Boolean> value (object)

type="xs:boolean" minOccurs="1" maxOccurs="1"                   == boolean value (primitive)

type="xs:boolean" minOccurs="1" maxOccurs="1" nillable="true"   == Boolean value (object)
景俊拔
2023-03-14

试试这个...

<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”部分。

封梓
2023-03-14

之所以使用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>

外部绑定文件是使用XJC的-b选项指定的。

xjc -b binding.xml my-schema.xsd

使用optionalProperty=“primitive”已打开以下错误以跟踪问题。

  • https://github.com/javaee/jaxb-v2/issues/510

如果您不喜欢在JAXB中生成类的方式,那么您可以自己创建一个类,并让JAXB将其作为生成类的架构的一部分。

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

我真正希望的是其中一个读者可能是jaxb开发团队成员,可以在jaxb中轻松完成更改。用户Archenroot在他对jaxb问题927(926的复制品)的评论中提供了一个可能的解决方案,这让我认为对于合适的人来说,修复jaxb是一项简单的工作

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

我已经在trunk中进行了测试,但问题依然存在。我将检查代码修复它有多容易。

希望你能真正解决这个问题。

 类似资料:
  • 问题内容: 我正在将项目从JAXB 1.0迁移到JAXB 2.1,并且数据类型映射存在问题。 我正在使用Ant xjc 绑定编译器,并且已经成功配置了全局绑定,例如(例如) xs:date 映射到 java.util.Calendar 。 但是我得到了生成的方法,这些方法可以返回,而我却想要。 这是复杂的类型: 生成的类如下所示: 问题是,尽管装箱可以工作,但是如果提供的XML不包含的值,则该类的

  • 我使用jaxb2-maven-plugin ver1.5生成Java类从XSD在我的项目。我的XSD看起来像: 反序列化到Java类后,我收到布尔值的免费文件夹,但我需要布尔值。我不能编辑XSD,因为它是公开的。有人知道如何在不改变方案的情况下解决这个问题吗?

  • 我正在从WSDL生成源代码。它生成包装器类型。我希望JAXB生成基本类型,而不是包装器。 在pom.xml 在我的WSDL文件中 在生成类中 我尝试设置bindingDirectory以强制使用原语而不是包装器。但jaxb2 maven插件2.5.0版本似乎不提供该选项。 aBindingConfiguration。xjb文件

  • 问题内容: 尝试按照Apple文档(和教程化的)创建Launch Helper时,我似乎遇到了麻烦,原因是将Objective- C代码移植到Swift中…在此方面,谁的编译器再也不过分了案件。 该错误似乎始终是: 我尝试过在多个位置进行转换,以防万一我只是在处理一个多余的,古老的原语(由Obj- C或Core Foundation引入)而无济于事。 为了以防万一,我尝试投射响应: 产生错误: …

  • 本文向大家介绍Java的布尔类型基本介绍,包括了Java的布尔类型基本介绍的使用技巧和注意事项,需要的朋友参考一下 Java 有一种表示逻辑值的简单类型,称为布尔型。它的值只能是真或假这两个值中的一个。它是所有的诸如a下面的程序说明了布尔类型的使用: 这个程序的运行结果如下所示: 关于这个程序有3件有趣的事情要注意。首先,你已经看到,当用方法println ( ) 输出布尔的值时,显示的是“tru

  • Dart为布尔数据类型提供内置支持,Dart中的布尔数据类型仅支持两个值 - 和。关键字用于表示Dart中的布尔文字。 在Dart中声明布尔变量的语法,如下所示 - 示例1 执行上面示例代码,得到以下结果 - 示例2 与JavaScript不同,布尔数据类型仅将文字识别为。任何其他值都被视为。考虑以下示例 - 如果在JavaScript中运行,上面的代码段将打印消息 - ,因为如果字符串不为空,结