如何使用Maven构建WSDL

Rob*_*t H 7 java wsdl web-services netsuite maven

我想用Maven替换提供的Ant构建.我知道(但没有使用过)蚂蚁跑,我也不愿意.

简而言之,NetSuite提供了一个wsdl,用于在进行Web服务调用时再次使用其ERP产品,我目前使用他们提供的ant构建来从wsdl生成代理类.(此处提供示例应用,wsdl和修补轴)

我遇到的问题是ant任务使用了修补的轴1.4(以及支持库,其中有几个是〜7年),我想使用中央maven仓库中可以获得的库来实现这个wsdl,最好是电流.

任何人都可以指出我需要研究一个有效的解决方案吗?

对于任何需要知道的人:我尝试使用axis2进行生成,并抛出以下异常:

timeException: Element QName is null for ExceededRequestSizeFault!
        at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.generate(CodeGenerationEngine.java:293)
        at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.java:35)
        at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.java:24)
Caused by: org.apache.axis2.wsdl.codegen.CodeGenerationException: java.lang.RuntimeException: Element QName is null for ExceededRequestSizeFault!
        at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.emitSkeleton(AxisServiceBasedMultiLanguageEmitter.java:1451)
        at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.generate(CodeGenerationEngine.java:275)
        ... 2 more
Caused by: java.lang.RuntimeException: Element QName is null for ExceededRequestSizeFault!
        at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.getFaultParamElements(AxisServiceBasedMultiLanguageEmitter.java:
2925)
        at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.getFaultElement(AxisServiceBasedMultiLanguageEmitter.java:2844)
        at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.generateMethodElement(AxisServiceBasedMultiLanguageEmitter.java:
2366)
        at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.loadOperations(AxisServiceBasedMultiLanguageEmitter.java:2242)
        at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.createDOMDocumentForSkeleton(AxisServiceBasedMultiLanguageEmitte
r.java:2156)
        at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.writeSkeleton(AxisServiceBasedMultiLanguageEmitter.java:2082)
        at org.apache.axis2.wsdl.codegen.emitter.AxisServiceBasedMultiLanguageEmitter.emitSkeleton(AxisServiceBasedMultiLanguageEmitter.java:1408)
        ... 3 more
Run Code Online (Sandbox Code Playgroud)

如果它是具有最新NetSuite WSDL的经过测试的解决方案,则可获得奖励.

ben*_*n75 12

我建议你使用cxf maven插件.我用这个wsdl做了一个小测试,它生成并编译成功(JVM 1.7)1408源文件.(耐心等待,需要一段时间......)

我只收到关于达到最大枚举大小的警告.所以我不得不传递一个绑定文件来允许更大的枚举.我是通过绑定文件完成的.感谢这篇文章

这是必需的bind.xml文件

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           jaxb:version="2.0">
    <jaxb:bindings >
        <jaxb:globalBindings typesafeEnumMaxMembers="2000"/>
    </jaxb:bindings>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)

和相关部分pom.xml(如你所见:wsdl和bind.xml都在/src/main/resources)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>2.7.3</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                       <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                               <bindingFiles>
                                    <bindingFile>${basedir}/src/main/resources/bind.xml</bindingFile>
                                </bindingFiles>
                               <wsdl>
                                  ${basedir}/src/main/resources/netsuite.wsdl
                               </wsdl>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)