如何避免 CXF codegen 更改模式中的元素名称?

How to avoid CXF codegen from changing element names in schema?

我在 Maven 项目中使用 cxf-codegen-plugin v. 3.2.4。 WSDL 引用架构:

<xsd:import namespace="http://mynamespace/"
                        schemaLocation="../schema/MySchema.xsd"/>

但是当生成的Server运行时,发布的wsdl是这样引用schema的:

<xsd:import namespace="http://mynamespace/" schemaLocation="http://localhost:9999/?xsd=1"/>

并且生成的 xsd 更改了给定方法的参数名称。原始模式具有以下定义:

<xs:complexType name="myMethod">
        <xs:sequence>
            <xs:element name="messageHeader" type="tns:soapMessageHeader" minOccurs="0"/>
            <xs:element name="myId" type="xs:string" minOccurs="0"/>
            <xs:element name="mySecondId" type="xs:string" minOccurs="0"/>
            <xs:element name="myThirdId" type="xs:string" minOccurs="0"/>
            <xs:element name="password" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

而生成的架构具有以下内容:

<xs:complexType name="myMethod">
<xs:sequence>
   <xs:element name="arg0" type="tns:soapMessageHeader" minOccurs="0"/>
   <xs:element name="arg1" type="xs:string" minOccurs="0"/>
   <xs:element name="arg2" type="xs:string" minOccurs="0"/>
   <xs:element name="arg3" type="xs:string" minOccurs="0"/>
   <xs:element name="arg4" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>

它将元素名称从定义的名称更改为 "arg0"、"arg..."。我不需要这样做。

我的 pom 有这个:

<plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${cxf.version}</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <sourceRoot>${source.wsdl.path}</sourceRoot>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>${basedir}/src/main/resources/wsdl/MyServiceDefinition.wsdl</wsdl>
                                    <extraargs>
                                        <extraarg>-impl</extraarg>
                                        <extraarg>-verbose</extraarg>
                                    </extraargs>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

为服务自动生成的接口具有@WebParam 注释。

有人能帮帮我吗?

我刚刚弄明白了:虽然为服务生成的接口有@WebParam 注释,但是实现 EndPoint 的相应具体 class 没有它。我认为这不是问题,因为接口有注释。然后我尝试将它们添加到参数中,瞧!生成的xsd一下子就出来了,可以读取参数了!

http://www.benmccann.com/web-services-tutorial-with-apache-cxf中,作者指出了endpointInterface注解属性的用法,以尊重自动生成的界面中的注解(由cxf本身):

@WebService(endpointInterface = "com.company.auth.service.AuthService",
            serviceName = "corporateAuthService")

此替代方案不需要额外的 xml 配置。

Tomcat EE 文档为我们提供了一个完整的示例:http://tomee.apache.org/examples-trunk/simple-webservice

另一个可能相关的 Whosebug 问题:jax-ws regarding endpointinterface