Я использую плагин cxf-java2ws-plugin для генерации файла WSDL из аннотированных классов JAX-WS.Для моих объектов данных;Я указываю тот факт, что внешний файл схемы уже существует (добавив аннотацию @XmlSchema с атрибутом location в файл package-info.java).Когда файл 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:
http://cxf.547215.n5.nabble.com/jira-Resolved-CXF-1693-Allow-custom-Jaxb-databinding-in-java2ws-just-like-in-wsdl2java-td4787407.html
И документация от jaxb, которая указывает, как передавать файл каталога, предполагает, что jaxb вызываетсянапрямую (либо через ant / maven, либо через инструмент командной строки командной строки);что не так с java2ws ...