当前位置: 首页 > 面试题库 >

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

强硕
2023-03-14
问题内容

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

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

但是我得到了生成的方法,这些方法可以返回Boolean,而我却想要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());

因为它尝试取消对传入的布尔值进行装箱-除非它为null。

我无法更改架构,也无法调整所有客户端代码以执行null检查。

我在我的 binding.xml中 设置了 optionalProperty 属性,如下所示: __

<globalBindings optionalProperty="primitive">

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

然而,这显然没有发生。

我怎么解决这个问题?

更新:

现在已在jaxb
2.2.9中修复此问题:https
://java.net/jira/browse/JAXB/fixforversion/16850


问题答案:

我无聊地等待开发团队的修复,所以我袖手旁观,自己动手做。

我包含以下代码,以帮助对这也是一个问题的人们。

免责声明 :我的代码可能不是解决问题的最佳方法,但对我有用。

现在,生成的代码如下所示:

public boolean isPricepointCustomFieldsRequired() {
    if (pricepointCustomFieldsRequired == null) {
        return false;
    } else {
        return pricepointCustomFieldsRequired;
    }
}

修改如下:

com.sun.tools.xjc.reader.xmlschema.bindinfo.BIProperty:createElementProperty,第〜358行

下线后

types.addTo(prop);

插入以下代码:

if (prop.isOptionalPrimitive() && getOptionalPropertyMode() == OptionalPropertyMode.PRIMITIVE &&
    !prop.getTypes().isEmpty() && "boolean".equals(prop.getTypes().get(0).getTypeName().getLocalPart()) )   {
        prop.defaultValue= CDefaultValue.create(CBuiltinLeafInfo.BOOLEAN, new XmlString("false"));
    }


 类似资料:
  • 我正在将一个项目从JAXB 1.0迁移到JAXB 2.1,我在数据类型映射方面遇到了问题。 我正在使用蚂蚁xjc绑定编译器,并且我已经成功地配置了全局绑定,以便(例如)xs: date映射到java.util.日历。 然而,我得到的生成方法返回,而我想要。 这里是复杂类型: 生成的类看起来像这样: 问题是,虽然装箱可以工作,但如果提供的XML不包含的值,则类的布尔字段为null,而不是false。

  • 我使用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引入)而无济于事。 为了以防万一,我尝试投射响应: 产生错误: …

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

  • 我对Java编码非常陌生,我已经研究这个问题大约4天了。我正在做一个选择你自己的结局故事。当我到达第69行时,如果读者选择是,我希望系统重新开始故事,如果他们选择否,则结束程序。我不确定我是否正确地编码了while循环,或者我甚至可以使用中断;操作员就像我在使用它一样。对不起,我的代码太难看了,哈哈,我正在努力变得更好。感谢您的建议! }