如何使用类自定义来解决文件生成冲突
我正在尝试使用Maven生成供Spring框架使用的JAXB文件,但Maven显示以下错误:
我知道它无法生成带有名称的文件,但我不知道如何解决这个问题。 到目前为止,我访问了以下链接。 1,2,3
org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 5; columnNumber: 39; A class/interface with the same name "hello.wsdl.SearchFlights" is already in use. Use a class customization to resolve this conflict. .... org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 12; columnNumber: 43; (Relevant to above error) another "SearchFlights" is generated from here. .... org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 371; columnNumber: 42; A class/interface with the same name "hello.wsdl.GetFlightDetails" is already in use. Use a class customization to resolve this conflict. ....
Maven插件
maven-war-plugin 2.4 WebContent org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.12.3 generate WSDL hello.wsdl http://www5v80.elsyarres.net/service.asmx?wsdl
我将以下package-info.java
文件添加到hello.wsdl
包中,但它没有帮助。
@XmlSchema( namespace = "ElsyArres.API", elementFormDefault = XmlNsForm.QUALIFIED) package hello.wsdl; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema;
您面临的错误消息基本上表明wsdl的types
部分中的某些名称是您使用过两次。 在您的情况下, 所有
标记都与其对应的类型(定义为
)具有相同的名称。
例:
这种情况非常罕见。
解决这些问题基本上有两种选择:
使用autoNameResolution
org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.13.1 generate -XautoNameResolution WSDL hello.wsdl http://www5v80.elsyarres.net/service.asmx?wsdl
该插件将通过在每个冲突名称后附加数字来解决所有命名冲突。 在上面提到的SearchFlights案例中,这将导致生成SearchFlights和SearchFlights2 。
更好的方法是使用绑定文件提前解决所有名称冲突。 绑定文件主要包含XPATH
表达式和转换规则。 附加到每个声明名称的绑定文件如下:
jaxb:nameXmlTransform
还有其他选项jaxb:nameXmlTransform
类似于后缀,并且前置于其他类型的xml元素(如类型)。
遗憾的是,我无法使用org.jvnet.jaxb2.maven2:maven-jaxb2-plugin
来处理这个绑定文件(但我确信有一个工作配置)
它仍然适用于org.codehaus.mojo:jaxws-maven-plugin
和以下配置。
org.codehaus.mojo jaxws-maven-plugin 2.4.1 wsimport ${basedir}/src/main/resources/bindings.xjb http://www5v80.elsyarres.net/service.asmx?wsdl -Djavax.xml.accessExternalSchema=all
如果autoNameResolution修复
-XautoNameResolution
不起作用,尝试:
-B-XautoNameResolution
删除
标记解决了我的问题。