我正在使用cxf-java2ws-plugin从JAX-WS注释类生成WSDL文件。对于我的数据对象;我指定了一个外部模式文件已存在的事实(通过向package-info.java文件添加带有location属性的@XmlSchema注释)。生成WSDL文件时;声明了导入模式的名称空间;但架构文件本身永远不会导入。这会导致架构格式错误。
我的插件配置如下:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-java2ws-plugin</artifactId>
<version>2.4.2</version>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>2.4.2</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>process-classes</id>
<phase>process-classes</phase>
<configuration>
<className>com.mycorp.hello.HelloWebService</className>
<genWsdl>true</genWsdl>
<verbose>true</verbose>
<outputFile>${basedir}/src/main/webapp/WEB-INF/wsdl/HelloWebService.wsdl</outputFile>
</configuration>
<goals>
<goal>java2ws</goal>
</goals>
</execution>
</executions>
</plugin>
以下是package-info.java文件的示例:
@javax.xml.bind.annotation.XmlSchema(location="http://localhost:16899/schema/model.xsd", namespace="urn:ws.mycorp.com:hello:model")
package com.mycorp.hello.model;
以下是预先存在的架构文件:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:ws.mycorp.com:hello:model" xmlns:tns="urn:ws.mycorp.com:hello:model" elementFormDefault="qualified">
<complexType name="MessageObject">
<sequence>
<element name="message" nillable="true" type="string"></element>
</sequence>
</complexType>
</schema>
以下是生成的架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:ws.mycorp.com:hello:model" xmlns:tns="http://hello.mycorp.com/" elementFormDefault="unqualified" targetNamespace="http://hello.mycorp.com/" version="1.0">
<xs:import namespace="urn:ws.mycorp.com:hello:model"/>
<xs:element name="getHelloMessage" type="tns:getHelloMessage"/>
<xs:element name="getHelloMessageResponse" type="tns:getHelloMessageResponse"/>
<xs:complexType name="getHelloMessage">
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getHelloMessageResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="ns1:messageObject"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
注意如何声明和导入“urn:ws.mycorp.com:hello:model”命名空间,但缺少实际的模式位置(http:// localhost:16899 / schema / model.xsd)。因此,生成的模式有错误,因为无法找到ns1:messageObject。
显然,我可以手动修改生成的模式;但这变得令人讨厌,因为每次修改代码时我都必须这样做...而且在现实世界的场景中(我把这个简单的测试用例放在一起来说明问题),可能会有超过1个现有的架构文件。
编辑:在对此进行更多研究后,我认为问题是JAXB需要一个目录文件:http://jaxb.java.net/guide/Fixing_broken_references_in_schema.html
目录文件允许JAXB将现有命名空间(urn:ws.mycorp.com:hello:model)解析为实际位置。不幸的是,java2ws cxf工具似乎缺乏自定义JAXB数据绑定过程的选项:
来自jaxb的文档指示如何传递目录文件假定jaxb直接被调用(通过ant / maven或命令行CLI工具);这与java2ws不同......