You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven根据WSDL生成多参方法而非单参的原因及解决办法

问题分析与解决方案

为什么生成的是拆分参数的方法?

你遇到的核心问题是默认JAX-WS参数风格配置和工具版本兼容性导致的:

  1. 你使用的org.codehaus.mojo:jaxws-maven-plugin 2.6版本较为老旧,默认启用了wrapperStyle模式——这个模式会自动将SOAP请求/响应对象拆分为单独的方法参数,输出参数则用Holder类包装,这就是你看到多参数方法的原因。
  2. Java 11已经移除了JDK自带的JAX-WS和JAXB实现,旧插件版本未适配这个变化,可能导致依赖缺失或生成逻辑异常。

如何生成你期望的单参数BARE风格代码?

按照以下步骤调整你的Maven配置:

1. 更新依赖,添加Java 11兼容的JAX-WS/JAXB运行时

Java 11不再自带JAX-WS实现,需要手动添加运行时依赖。修改你的dependencies块:

<dependencies>
    <!-- JAX-WS API -->
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.3.5</version>
    </dependency>
    <!-- JAX-WS 运行时实现 -->
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>2.3.5</version>
        <scope>runtime</scope>
    </dependency>
    <!-- JAXB API -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <!-- JAXB 运行时实现 -->
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.5</version>
        <scope>runtime</scope>
    </dependency>
    <!-- 其他必要依赖 -->
    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.3.2</version>
    </dependency>
</dependencies>

2. 更换并配置新版JAX-WS Maven插件

放弃老旧的org.codehaus.mojo插件,使用官方的com.sun.xml.ws:jaxws-maven-plugin,同时关闭wrapperStyle并指定绑定配置:

首先,在src/main/resources下创建一个binding.xml文件,用来强制指定参数风格:

<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
               version="2.0">
    <!-- 全局禁用Wrapper风格,启用BARE参数模式 -->
    <jaxws:bindings node="wsdl:definitions/wsdl:portType">
        <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
    </jaxws:bindings>
</jaxws:bindings>

然后修改build块中的插件配置:

<build>
    <plugins>
        <plugin>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.3.5</version>
            <executions>
                <execution>
                    <id>db</id>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <keep>true</keep>
                        <wsdlFiles>
                            <wsdlFile>${basedir}/src/main/resources/wsdl/db_search.wsdl</wsdlFile>
                            <wsdlFile>${basedir}/src/main/resources/wsdl/db_access.wsdl</wsdlFile>
                        </wsdlFiles>
                        <packageName>cz.czechpoint.isds.v20.db</packageName>
                        <sourceDestDir>${project.build.directory}/generated-sources/wsdl/db</sourceDestDir>
                        <!-- 应用绑定配置 -->
                        <bindingFiles>
                            <bindingFile>${basedir}/src/main/resources/binding.xml</bindingFile>
                        </bindingFiles>
                        <!-- 显式禁用Wrapper风格 -->
                        <enableWrapperStyle>false</enableWrapperStyle>
                    </configuration>
                </execution>
                <execution>
                    <id>dm</id>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <keep>true</keep>
                        <wsdlFiles>
                            <wsdlFile>${basedir}/src/main/resources/wsdl/dm_info.wsdl</wsdlFile>
                            <wsdlFile>${basedir}/src/main/resources/wsdl/dm_operations.wsdl</wsdlFile>
                        </wsdlFiles>
                        <packageName>cz.czechpoint.isds.v20.dm</packageName>
                        <!-- 修正之前的目录错误,避免代码冲突 -->
                        <sourceDestDir>${project.build.directory}/generated-sources/wsdl/dm</sourceDestDir>
                        <bindingFiles>
                            <bindingFile>${basedir}/src/main/resources/binding.xml</bindingFile>
                        </bindingFiles>
                        <enableWrapperStyle>false</enableWrapperStyle>
                    </configuration>
                </execution>
            </executions>
            <!-- 插件自身的依赖,确保Java11兼容 -->
            <dependencies>
                <dependency>
                    <groupId>com.sun.xml.ws</groupId>
                    <artifactId>jaxws-tools</artifactId>
                    <version>2.3.5</version>
                </dependency>
                <dependency>
                    <groupId>javax.xml.bind</groupId>
                    <artifactId>jaxb-api</artifactId>
                    <version>2.3.1</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

3. 验证生成结果

执行Maven命令:

mvn clean process-sources

此时生成的checkDataBox方法应该会和你期望的一致:

@WebMethod(operationName = "CheckDataBox") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
@WebResult(name = "CheckDataBoxResponse", targetNamespace = "http://isds.czechpoint.cz/v20", partName = "parameter") 
public TCheckDBOutput checkDataBox( 
    @WebParam(partName = "parameter", name = "CheckDataBox", targetNamespace = "http://isds.czechpoint.cz/v20") TIdDbInput parameter 
);

额外注意事项

  • 我修正了你dm执行块中的sourceDestDir错误(之前指向了db目录),避免不同模块的生成代码互相覆盖。
  • 版本选择上,2.3.5是稳定且兼容Java 11的JAX-WS版本,如果你需要更高版本,可以尝试2.4.x系列,但需确保依赖版本一致。

内容的提问来源于stack exchange,提问作者boucekv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:55:31