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

JAXB编译器将xs:long绑定到Java long,而不是原语long类

欧阳洲
2023-03-14

我正在从WSDL生成源代码。它生成包装器类型。我希望JAXB生成基本类型,而不是包装器。

在pom.xml

                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <version>2.5.0</version>
                <executions>
                    <execution>
                        <id>generate-stubs</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>xjc</goal>
                        </goals>
                        <configuration>
                            <sourceType>wsdl</sourceType>
                            <sources>
                                <source>
                                    ${project.basedir}/src/main/resources/wsdl/my.wsdl
                                </source>
                            </sources>
                            <clearOutputDir>true</clearOutputDir>
                        </configuration>
                    </execution> 
</plugin>

在我的WSDL文件中

<xs:element minOccurs="0" name="initBal" type="xs:long"/>

在生成类中

protected Long initBal;

我尝试设置bindingDirectory以强制使用原语而不是包装器。但jaxb2 maven插件2.5.0版本似乎不提供该选项。

<configuration>
                            <sourceType>wsdl</sourceType>
                            <sources>
                                <source>
                                    ${project.basedir}/src/main/resources/wsdl/my.wsdl
                                </source>
                            </sources>
                            <clearOutputDir>true</clearOutputDir>
                            <xjbSources>
                                <xjbSource>${project.basedir}/src/main/resources/wsdl/aBindingConfiguration.xjb</xjbSource>
                            </xjbSources>
                        </configuration>

aBindingConfiguration。xjb文件

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
        <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
    </jaxws:bindings>
</jaxb:bindings>

共有1个答案

宰父飞翼
2023-03-14

通常不能将基元类型用于可为null的值,因为基元不可为null。您必须删除minOccurs=“0”,它指示一个可为空的值。

看看使用JAXB生成Java原语类型的XML模式类型,它并没有向其中添加required

但是进一步研究,我发现了JAXB绑定的设置,官方的自定义JAXB绑定没有描述这个设置https://docs.oracle.com/javase/tutorial/jaxb/intro/custom.html

optionalProperty="primitive"

看看https://download.oracle.com/javaee-archive/jaxb.java.net/users/2011/05/10121.html,JAXB编译器将xs: boolean绑定到Java布尔包装类,而不是布尔基元类型

您还可以尝试使用JAXB绑定来获取其他方法来询问值状态

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

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

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

  • 在我的 maven 项目中,我目前正在将我的 Java 代码与一些 Groovy 代码混合在一起。在这一点上,我主要使用Groovy来构建豆子。我的一些Java代码直接使用Groovy豆。 我这样配置Maven编译器插件:- 当我使用运行我的测试用例时,它工作得很好。 然而,当我通过右键单击测试文件直接从IntelliJ运行测试用例并运行它时,Groovy bean上会出现“找不到符号”错误。当我

  • 我的XSD中有以下属性: 我从这个XSD生成类,属性被创建为,然后如果没有这个类中的属性,我就无法对XML进行封送(据我所知,在这种情况下,它将始终具有一些值,这些值将被封送)。 如何在绑定期间更改XSD以创建类型,以便在该字段中使用null(以便在编组期间可以忽略它)? 或者有更好的方法在结果XML不存在时从其中删除该属性?

  • 词法分析器 语法分析器 语义分析及中间代码生成 代码优化 代码生成