Apache CXF 插件 - 故障生成客户端

Apache CXF Plugin - Failure Generating Client

我正在尝试使用 Apache CXF Maven 插件生成 Web 服务客户端,但我 运行 遇到了错误。 我在 eclipse 中只有一个非常简单的 maven 项目设置 wsdl 文件位于此处 - http://api.zenfolio.com/api/1.8/zfapi.asmx?wsdl

我使用的pom文件如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>WebserviceClientGenerator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
    <cxf.plugin.version>3.1.4</cxf.plugin.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>${cxf.plugin.version}</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${project.build.directory}/src/main/java/com/test</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>http://api.zenfolio.com/api/1.8/zfapi.asmx?wsdl</wsdl> 
                                <extraargs>
                                    <extraarg>-impl</extraarg>
                                    <extraarg>-verbose</extraarg>
                                </extraargs>
                            </wsdlOption>
                        </wsdlOptions>                          
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

当我 运行 在此 pom 文件上安装 maven 时,出现以下错误

    [ERROR] http://api.zenfolio.com/api/1.8/zfapi.asmx?wsdl [1559:11]: undefined simple or complex type 'soapenc:Array'
org.xml.sax.SAXParseExceptionpublicId: http://api.zenfolio.com/api/1.8/zfapi.asmx?wsdl; systemId: http://api.zenfolio.com/api/1.8/zfapi.asmx?wsdl; lineNumber: 1559; columnNumber: 11; undefined simple or complex type 'soapenc:Array'
    at com.sun.xml.xsom.impl.parser.ParserContext.reportError(ParserContext.java:180)
    at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.reportError(NGCCRuntimeEx.java:175)
    at com.sun.xml.xsom.impl.parser.DelayedRef.resolve(DelayedRef.java:110)
    at com.sun.xml.xsom.impl.parser.DelayedRef.run(DelayedRef.java:85)
    at com.sun.xml.xsom.impl.parser.ParserContext.getResult(ParserContext.java:135)
    at com.sun.xml.xsom.parser.XSOMParser.getResult(XSOMParser.java:214)
    at com.sun.tools.xjc.ModelLoader.createXSOM(ModelLoader.java:538)
    at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:269)
    at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:95)
    at org.apache.cxf.tools.wsdlto.databinding.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:460)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.generateTypes(WSDLToJavaContainer.java:726)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.processWsdl(WSDLToJavaContainer.java:270)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:164)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:415)
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:103)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:113)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:86)
    at org.apache.cxf.maven_plugin.wsdl2java.WSDL2JavaMojo.generate(WSDL2JavaMojo.java:415)
    at org.apache.cxf.maven_plugin.AbstractCodegenMoho.execute(AbstractCodegenMoho.java:260)
    at org.apache.cxf.maven_plugin.wsdl2java.WSDL2JavaMojo.execute(WSDL2JavaMojo.java:512)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)

有谁知道我是否对 cxf 插件进行了任何配置以使其正常工作?

不幸的是,WSDL 使用 SOAP 编码,Apache CXF(或任何当前的相关技术)不支持该编码。

您必须依赖旧的 SOAP 堆栈,例如 Axis 1.x,它们是唯一可以处理此类过时编码的堆栈。使用 axistools-maven-plugin 和 Axis 1.4,您可以为 WSDL 生成客户端存根:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>axistools-maven-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <id>generate-client</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
            <configuration>
                <urls>
                    <url>http://api.zenfolio.com/api/1.8/zfapi.asmx?wsdl</url>
                </urls>
            </configuration>
        </execution>
    </executions>
</plugin>

然后您需要将 Axis 1.4 添加为编译时依赖项:

<dependency>
    <groupId>axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>

生成的客户端默认位于 target/generated-sources/axistools/wsdl2java,但您可以使用 outputDirectory 配置元素覆盖它。