为啥 Maven 生成具有 5 个参数而不是 wsdl 参数的方法?

Posted

技术标签:

【中文标题】为啥 Maven 生成具有 5 个参数而不是 wsdl 参数的方法?【英文标题】:Why is Maven generating method with 5 parameters instead of one from wsdl?为什么 Maven 生成具有 5 个参数而不是 wsdl 参数的方法? 【发布时间】:2021-04-07 01:42:01 【问题描述】:

我正在使用 maven 和 Java 11。我正在从 wsdl 生成类。我希望看到这个

@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
);

但它会生成这个

@WebMethod(operationName = "CheckDataBox")
@RequestWrapper(localName = "CheckDataBox", targetNamespace = "http://isds.czechpoint.cz/v20", className = "cz.czechpoint.isds.v20.db.TIdDbInput")
@ResponseWrapper(localName = "CheckDataBoxResponse", targetNamespace = "http://isds.czechpoint.cz/v20", className = "cz.czechpoint.isds.v20.db.TCheckDBOutput")
public void checkDataBox(
        @WebParam(name = "dbID", targetNamespace = "http://isds.czechpoint.cz/v20")
                String dbID,
        @WebParam(name = "dbApproved", targetNamespace = "http://isds.czechpoint.cz/v20")
                Boolean dbApproved,
        @WebParam(name = "dbExternRefNumber", targetNamespace = "http://isds.czechpoint.cz/v20")
                String dbExternRefNumber,
        @WebParam(name = "dbState", targetNamespace = "http://isds.czechpoint.cz/v20", mode = WebParam.Mode.OUT)
                Holder<Integer> dbState,
        @WebParam(name = "dbStatus", targetNamespace = "http://isds.czechpoint.cz/v20", mode = WebParam.Mode.OUT)
                Holder<TDbReqStatus> dbStatus);

我正在使用

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.xml.ws</groupId>
    <artifactId>jaxws-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.jws</groupId>
    <artifactId>javax.jws-api</artifactId>
    <version>1.1</version>
</dependency>
...

<build>
    ...
    <plugins>
        ...
        <plugin>
            <!--groupId>com.sun.xml.ws</groupId-->
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <!--version>2.3.2</version-->
            <version>2.6</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>
                    </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/db</sourceDestDir>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

wsdl 文件可以在这里找到https://github.com/dfridrich/CzechDataBox/tree/master/Resources(这是来自不同人的不同项目,但我使用的是相同的 wsdl。)

为什么没有生成一个参数,我需要做些什么来实现它?

【问题讨论】:

【参考方案1】:

wsimport 决定如何使用enableWrapperStyle 配置处理参数。您可以遵循两种方法来避免使用更多参数而不是单个参数。

选项 1. 使用绑定文件

您不需要更新 WSDL 文件。告诉wsimport 如何处理方法参数。

src/main/resources/wsdl 中创建一个名为binding.xml 的文件。

绑定.xml

<bindings
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns="http://java.sun.com/xml/ns/jaxws">
    <!-- Disable default wrapper style -->
    <enableWrapperStyle>false</enableWrapperStyle>
</bindings>

使用以下脚本更新您的pom.xml。还有一个额外的步骤是bindingFiles 元素。

pom.xml

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.6</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>
                <bindingFiles>
                    <bindingFile>$project.basedir/src/main/resources/binding.xml</bindingFile>
                </bindingFiles>
                <packageName>cz.czechpoint.isds.v20.db</packageName>
                <sourceDestDir>$project.build.directory/generated-sources/wsdl/db</sourceDestDir>
            </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>
                <bindingFiles>
                    <bindingFile>$project.basedir/src/main/resources/binding.xml</bindingFile>
                </bindingFiles>
                <packageName>cz.czechpoint.isds.v20.dm</packageName>
                <sourceDestDir>$project.build.directory/generated-sources/wsdl/db</sourceDestDir>
            </configuration>
        </execution>
    </executions>
</plugin>

参考:wsimport: Disable Wrapper Style

选项 2. 更改 Wsdl 文件

在每个 WSDL 文件中的 XML 定义下方插入。添加此定义后,方法的参数将只是单个输入参数,而不是所有参数。

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

示例:db_search.wsdl(粘贴到所有 wsdl 文件)

<definitions name="ISDS_db" targetNamespace="http://isds.czechpoint.cz/v20" 
                                  xmlns="http://schemas.xmlsoap.org/wsdl/" 
                                  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
                                  xmlns:tns="http://isds.czechpoint.cz/v20">

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

    <types>
      <xs:schema targetNamespace="http://isds.czechpoint.cz/v20">
        <xs:include schemaLocation="IsdsStat.xsd" />
      </xs:schema>
    </types>
    ....

【讨论】:

说得很好。 非常感谢。有用。但我希望我能够配置插件,因为 wsdl 文件来自外部公司,我真的不想碰它们。我需要使用外部网络服务。 @boucekv 我建议您将 WSDL 下载到您的工作区中,这样更安全、构建速度更快,并且无需服务器关闭 WSDL 源即可保持您的项目构建。 我下载了它们,但我不想修改它们。如果可能的话。 @boucekv 感谢您,我发现了一种新方法。我曾经遵循更新 WSDL 以避免多个参数。但是,绑定文件的方法更好。

以上是关于为啥 Maven 生成具有 5 个参数而不是 wsdl 参数的方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥对函数的 VLA 数组参数使用星号“[*]”而不是整数?

python 的range()函数怎么使用,为啥单独运行print(range(1,5))输出还是range(1,5),而不是[1,2,3,4]

为啥我可以在 Qt 5.5.1 中使用 QSerialPort* 作为临时变量而不是作为类的成员?

为啥scala maven工件对每个scala版本都有一个工件,而不是每个scala版本都有一个分类器?

MFC 下列函数 GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000为啥要和0x80000做运算

为啥 AbstractFactoryUnit 具有动态而不是静态多态性?