我正在使用maven脚本生成我需要与WCF服务通信的Java代码.我已经进行了沟通工作,并准备将我的maven脚本及其生成的代码与项目中的其余Java代码集成.
但是,我无法让maven生成具有我想要的正确包名的代码.从我在网上看到的,我应该使用标签,我已经看到了两个可能的地方.我已经包含了我认为需要进入的脚本部分,以及它们都存在.但是,这些标记不会产生任何影响,代码生成就像没有它们一样
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<configuration>
<packageName>com.name.server.cxf</packageName>
<sourceRoot>src/com/server/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>src/com/server/cxf/code-generation/service.xml</wsdl>
<bindingFiles>
<bindingFile>src/com/server/cxf/code-generation/javabindings.xml</bindingFile>
</bindingFiles>
<extraargs>
<extraarg>-validate</extraarg>
<extraarg>-client</extraarg>
<extraarg>-verbose</extraarg>
<extraarg>-xjc-verbose</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
<verbose />
</configuration>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>wsdl2java</goal>
</goals>
<configuration>
<packageName>com.name.server.cxf</packageName>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
也许我使用的是错误的标签,或者它可能是在错误的地方?
从 Java 8 迁移到 Java 11。
将 cxf-codegen-plugin 从版本 3.2.0 更新到 3.3.6。
插件仍然使用 javax.jws.* 中的包(而不是 jakarta.jws.* 中的包)从 wsdl 文件生成 Java 存根:
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
/**
* This class was generated by Apache CXF 3.3.6
* 2020-08-12T19:22:40.406+02:00
* Generated source version: 3.3.6
*
*/
Run Code Online (Sandbox Code Playgroud)
我是否误认为 javax.jws 已弃用,应该更改为 jakarta.jws?
如何使用所需的包完成代码生成?
我一直在使用JDK 9&10和CXF codegen插件3.2.5和3.2.6没有问题,但今天我正在尝试将我的代码库从Oracle JDK 10更新到OpenJDK 11 build 28,但我总是得到同样的错误:
[INFO] Error occurred during initialization of boot layer
[INFO] java.lang.module.FindException: Module java.xml.ws not found
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.747 s
[INFO] Finished at: 2018-10-17T16:38:38+02:00
[INFO] Final Memory: 17M/60M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.cxf:cxf-codegen-plugin:3.2.6:wsdl2java (cerberus-wsdl) on project cerberus:
[ERROR] Exit code: 1
[ERROR] Command line was: /opt/prod_jdk/bin/java --add-modules java.activation,java.xml.bind,java.xml.ws --add-exports=java.xml.bind/com.sun.xml.internal.bind.v2.runtime=ALL-UNNAMED --add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED --add-exports=java.xml/com.sun.org.apache.xerces.internal.impl.xs=ALL-UNNAMED --add-exports=java.xml.bind/com.sun.xml.internal.bind.marshaller=ALL-UNNAMED --add-opens java.xml.ws/javax.xml.ws.wsaddressing=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens …Run Code Online (Sandbox Code Playgroud) 我有一个WSDL文件,其中包含以下条目:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:CP_Ablakido" xmlns:s0="urn:CP_Ablakido" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xsd:schema elementFormDefault="qualified" targetNamespace="urn:CP_Ablakido">
<xsd:element name="GetList_11" type="s0:InputMapping1"/>
<xsd:complexType name="InputMapping1">
<xsd:sequence>
<xsd:element name="Qualification" type="xsd:string"/>
<xsd:element name="startRecord" type="xsd:string"/>
<xsd:element name="maxLimit" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="GetList_11Response" type="s0:OutputMapping1"/>
<xsd:complexType name="OutputMapping1">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="getListValues">
<xsd:complexType>....
Run Code Online (Sandbox Code Playgroud)
我使用CXF Codegen插件进行以下设置:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${basedir}/target/generated-sources/wsdl2java</sourceRoot>
<encoding>UTF-8</encoding>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
生成的java代码如下所示:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "OutputMapping1", propOrder = {
"getListValues"
})
public class OutputMapping1 {
@XmlElement(required = true)
protected List<OutputMapping1 …Run Code Online (Sandbox Code Playgroud) 当我指定每个文件时,我能够使用带有相对wsdlLocation的生成类,例如
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/resources/sample.wsdl</wsdl>
<wsdlLocation>classpath:wsdl/sample.wsdl</wsdlLocation>
</wsdlOption>
</wsdlOptions>
相反,我想使用<wsdlRoot>所以我不需要指定生成类的每个wsdl.
例如
<wsdlRoot>${basedir}/src/main/resources/wsdl</wsdlRoot>
<includes>
<include>*.wsdl</include>
</includes>
这适用于为目录中的每个wsdl生成类,但是,生成的类中的wsdlLocation是wsdl在我的机器上的绝对路径.我想要一个相对路径,所以代码更便携.使用wsdlRoot时是否可以指定相对wsdlLocation?
谢谢
我从基于cxf-codegen-plugin. 我使用额外的绑定
Date而不是XmlGregorianCalender这适用于版本 3.5.5
当我切换到 4.0.0 时,这不再起作用(默认包并被XmlGregorianCalender使用)。我在迁移指南中找不到任何相关内容。
这是我的配置
pom.xml
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>4.0.0</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>https:url?wsdl</wsdl>
<bindingFiles>
<bindingFile>${basedir}/src/main/resources/bindings.xml</bindingFile>
</bindingFiles>
<extraargs>
<extraarg>-verbose</extraarg>
<extraarg>-p</extraarg>
<extraarg>http://url/service=com.some.package</extraarg>
<extraarg>-xjc-Xts:style:org.apache.commons.lang3.builder.ToStringStyle.DEFAULT_STYLE</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.cxf.xjcplugins</groupId>
<artifactId>cxf-xjc-ts</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
绑定
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:jaxws="http://cxf.apache.org/jaxws"
version="2.1">
<jaxb:bindings schemaLocation="https://url.file.xsd"
node="/xsd:schema">
<jaxb:schemaBindings>
<jaxb:package name="com.some.package.dto" />
</jaxb:schemaBindings>
<jaxb:globalBindings>
<jaxb:javaType name="java.util.Date"
xmlType="xsd:dateTime"
parseMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.parseDateTime"
printMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.printDateTime" …Run Code Online (Sandbox Code Playgroud) 我希望通过 maven 执行 wsdl2java 并尝试了几种不同的方法但没有完全成功。我做的第一种方式:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>org.apache.axis.wsdl.WSDL2Java</mainClass>
<arguments>
<argument>-client</argument>
<argument>-o</argument>
<argument>gensrc</argument>
<argument>wsdl/JobAPIWebWrapped.wsdl</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
由于对 org.apache.axis.wsdl.WSDL2Java 的调用,此版本将创建我正在寻找的确切结构,但不会继续使用除此之外的任何其他 maven 插件。它以执行 main 或类似的东西来结束日志。
我尝试过的另一种方法:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>gensrc</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>wsdl/JobAPIWebWrapped.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
此执行的问题在于它生成的 java 文件比之前执行的更高。我检查了这个更大的文件集的兼容性,发现它可以正常工作,但想找到一种方法来强制它使用与第一个示例相同的 java 类来执行。但是,此版本将完成并允许我继续使用 maven 调用的以下插件。
第三:
<plugin>
<groupId>org.apache.axis</groupId>
<artifactId>wsdl2java-maven-plugin</artifactId>
<version>1.4.1-SNAPSHOT</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<implementationClassName>org.apache.axis.wsdl.WSDL2Java</implementationClassName>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这个版本甚至没有被识别......想知道我是否错误地调用了插件,因为它甚至没有出现在任何带有详细日志记录的地方。 …
我目前正在使用 Maven 的 Apache CXF 代码生成插件(版本 3.1.1)从我们的客户端提供的 WSDL 生成源代码。我指定了 wsdl2java 目标,并且我想为多个服务生成代码。我知道您可以<serviceName>在<wsdlOption>标签下指定 a ,但是当我尝试放置多个<serviceName>,或者甚至<wsdlOption>使用<wsdl>具有不同的相同值创建另一个时<serviceName>,它似乎忽略其中一个,而只为一项服务生成类。
我发现解决此问题的唯一方法是创建另一个相同的<execution>块并更改<serviceName>. 我做错了什么,或者这是唯一的方法吗?这是一个的整体设置<execution>(出于隐私考虑,路径和服务名称已更改):
<execution>
<id>generate-sources-a</id>
<phase>generate-sources</phase>
<configuration>
<encoding>UTF-8</encoding>
<defaultOptions>
<bindingFiles>
<bindingFile>binding.xjb</bindingFile>
</bindingFiles>
</defaultOptions>
<sourceRoot>${project.build.directory}/generated-sources</sourceRoot>
<wsdlRoot>${project.build.directory}/wsdl</wsdlRoot>
<includes>
<include>Path/To/WSDL/MyWSDL.wsdl</include>
</includes>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/Path/To/WSDL/MyWSDL.wsdl</wsdl>
<serviceName>ServiceA</serviceName>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
Run Code Online (Sandbox Code Playgroud)
我试过这两个:
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/Path/To/WSDL/MyWSDL.wsdl</wsdl>
<serviceName>ServiceA</serviceName>
<serviceName>ServiceB</serviceName>
</wsdlOption>
</wsdlOptions>
Run Code Online (Sandbox Code Playgroud)
...和这个(在http://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html 的示例 4 中使用):
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/Path/To/WSDL/MyWSDL.wsdl</wsdl>
<serviceName>ServiceA</serviceName>
</wsdlOption>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/Path/To/WSDL/MyWSDL.wsdl</wsdl> …Run Code Online (Sandbox Code Playgroud) 我试图复制这个插件在Gradle中的作用.如果我执行:
./wsdl2java -encoding UTF-8 -d /src/target/generated-sources/cxf -fe jaxws21
-sn UserSoapServicePorts -faultSerialVersionUID 1 -xjc-Xannotate
-p http:... -p urn:... -p urn:... -p urn:... -p urn:h... -p urn:...
-p urn:... -p urn:...
-verbose /src/xmlTemp/user-soap-v1.wsdl
Run Code Online (Sandbox Code Playgroud)
...然后我得到:
an 22, 2016 3:51:05 PM org.apache.cxf.wsdl11.WSDLServiceBuilder checkForWrapped
INFO: Operation {urn:stuff:wsdl:person:v1}doSomething cannot be unwrapped, input message must reference global element declaration with same localname as operation
Run Code Online (Sandbox Code Playgroud)
据我所知,尽管线条相同.什么想法可能是错的?
在我的项目中,我使用的是 java 11。
基于 WSDL 文件,我使用cxf-codegen-pluginMaven 插件生成代码类。java 11 上生成的类、使用javax.xml.ws.*和其他 API。
例子 :
extends Service 来自该库的生成类之一javax.xml.ws.Service在 java 11 上并未弃用,但我遇到了兼容性错误。
java.lang.IllegalArgumentException: JAXP09020005: The specified argument 'classpath:/schemas/wsdl' (case sensitive) for 'setRewritePrefix' is not valid.
at java.xml/javax.xml.catalog.CatalogMessages.reportIAE(CatalogMessages.java:140) ~[na:na]
at java.xml/javax.xml.catalog.BaseEntry.verifyURI(BaseEntry.java:231) ~[na:na]
at java.xml/javax.xml.catalog.RewriteSystem.setRewritePrefix(RewriteSystem.java:65) ~[na:na]
at java.xml/javax.xml.catalog.RewriteSystem.<init>(RewriteSystem.java:47) ~[na:na]
at java.xml/javax.xml.catalog.CatalogReader.startElement(CatalogReader.java:190) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:510) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:351) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2708) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:534) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888) ~[na:na]
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824) ~[na:na]
at …Run Code Online (Sandbox Code Playgroud)