我基于
cxf-codegen-plugin
从 wsdl 创建代码。我使用额外的绑定来
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>
绑定
<?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" />
<jaxb:javaType name="java.util.Date"
xmlType="xsd:date"
parseMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.parseDate"
printMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.printDate"/>
<jaxb:javaType name="java.util.Date"
xmlType="xsd:time"
parseMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.parseTime"
printMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.printTime"/>
</jaxb:globalBindings>
</jaxb:bindings>
</jaxb:bindings>
不幸的是,看起来 4.0.0 插件有问题。我遇到了同样的问题 - 绑定文件被忽略了。
我用单一设置测试过它:
总是得到相同的结果: [警告] 警告:文件:/C:/skr/src/main/resources/Service/language.xsd [3,3]:由于 EnumMemberSizeCap 限制,简单类型“LanguageCodeEnum”未映射到枚举。 Facets 计数:501,当前限制:256。您可以使用自定义属性“typesafeEnumMaxMembers”来扩展限制。
所以这个来源被忽略了,没有生成工件。
相同的绑定文件适用于以前 (3.5.5) 版本的插件。
我在 4.0.0 版也遇到过同样的问题。似乎所有 javax.* 规范都被 jakarta.* 规范替换了。
所以我意识到我必须将绑定文件中的
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
和xmlns:jaxws="http://cxf.apache.org/jaxws"
替换为雅加达的:
<jaxb:bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
xmlns:jaxws="https://jakarta.ee/xml/ns/jaxws"
version="3.0">
....
</jaxb:bindings>
正如我所看到的官方 apache cxf 文档没有明确提及这一点。但是您可以在 here.
检查 Jakarta XML Web Services WSDL 自定义描述符的 XML Schema