Напишите веб-службу jax-ws и создайте WSDL без XSD
Я написал простую веб-службу JAX-WS для сервера приложений tomcat на java.
У меня есть один интерфейс и класс реализации:
Интерфейс
@WebService(name = "myWs")
@SOAPBinding(style = Style.RPC)
public interface IMyWs {
@WebMethod(operationName = "getUser")
Response getUser(@WebParam(name = "phone", mode = Mode.IN) String phone);
}
реализация
@WebService(endpointInterface = "ge.mari.IMyWs")
public class MyWs implements IMyWs {
@Override
public Response getUser(String phone) {
// SOME CODE
return response;
}
}
Моя проблема в том, что в моем wsdl файле класс Response определен в файле xsd.
Это фрагмент из моего wsdl файла
<types>
<xsd:schema>
<xsd:import namespace="http://ws.mari.ge/" schemaLocation="http://localhost:8080/MyServcie/MyWs?xsd=1">
</xsd:import>
</xsd:schema>
</types>
Как сделать веб-сервис для генерации всех типов в файле WSDL вместо отдельного XSD файла?
Следует ли мне изменить любую конфигурацию или добавить некоторую аннотацию к моему веб-сервису?
Ответы
Ответ 1
У вас может быть JAX-WS вставить сгенерированную схему в ваш файл WSDL с помощью
-inlineSchemas
переключатель командной строки. [1]
Если вы используете Maven в своем проекте, вы можете настроить плагин JAX-WS maven, чтобы сделать то же самое с элементом конфигурации inlineSchemas в вашей конфигурации выполнения следующим образом: [2]
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>SomeId</id>
<goals>
<goal>wsgen</goal>
</goals>
<phase>prepare-package</phase>
<configuration>
<sei>some.class.Name</sei>
<genWsdl>true</genWsdl>
<keep>true</keep>
<resourceDestDir>some/target/dir</resourceDestDir>
<inlineSchemas>true</inlineSchemas>
</configuration>
</execution>
</executions>
</plugin>
Никаких изменений в вашем Java-классе не требуется.
[1] http://jax-ws.java.net/nonav/2.2.1/docs/wsgen.html
[2] http://jax-ws-commons.java.net/jaxws-maven-plugin/wsgen-mojo.html
Ответ 2
AFAIK невозможно, чтобы JAX генерировал WSDL со встроенными схемами.
BTW: Разделение определения WSDL и схемы XSD является хорошим шагом (вы можете использовать структуру объекта, определенную схемой, в другом контексте, например, хранение данных в файлах или что-то в этом роде).
Сказанное: если вы нуждаетесь в "все в одном" WSDL (потому что это требует какой-то древний клиент), вы всегда можете jax-ws
генерировать WSDL изначально, а затем редактировать его в своем сердечном содержимом, Измененный WSDL может быть включен с использованием параметра wsdlLocation
аннотации @WebService
.
Ответ 3
На самом деле невозможно использовать inlineSchemas
с генератором WSDL времени выполнения. Я отладил генерацию WSDL и нашел эту строку в EndpointFactory
, где функция inlineSchemas
(которая фактически присутствует в инструменте wsgen
) просто установлена на false
:
/**
* Generates the WSDL and XML Schema for the endpoint if necessary
* It generates WSDL only for SOAP1.1, and for XSOAP1.2 bindings
*/
private static SDDocumentImpl generateWSDL(WSBinding binding, AbstractSEIModelImpl seiModel, Collection<SDDocumentImpl> docs,
Container container, Class implType) {
// [...]
WSDLGenInfo wsdlGenInfo = new WSDLGenInfo();
// [...]
wsdlGenInfo.setInlineSchemas(false);
// [...]
seiModel.getDatabinding().generateWSDL(wsdlGenInfo);
// [...]
}
https://github.com/eclipse-ee4j/metro-jax-ws/blob/f37dae6bdfd03bafdad63ed05b27dbfc3c38af1b/jaxws-ri/rt/src/main/java/com/sun/xml/ws/server/EndpointFactory.java#L658
Существует также открытая проблема для JAX-WS, чтобы изменить это (но я думаю, что больше нет надежды на изменения в JAX-WS).https://github.com/eclipse-ee4j/metro-jax-ws/issues/49