Напишите веб-службу jax-ws и сгенерируйте WSDL без XSD

Я написал простой веб-сервис JAX-WS для сервера приложений tomcat на java.

У меня один интерфейс и класс реализации:
interface

@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-файле класс ответа определен в 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?
Следует ли мне изменить какую-либо конфигурацию или добавить аннотацию к моей веб-службе?


person mariami    schedule 01.07.2013    source источник


Ответы (3)


Вы можете заставить 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

person Kallja    schedule 06.08.2013
comment
Спасибо. Ваш спаситель. - person Sahan Maldeniya; 17.10.2014

AFAIK невозможно, чтобы JAX генерировал WSDL со встроенными схемами.

Кстати: разделение определения WSDL и схемы XSD - хороший ход (вы можете использовать структуру объекта, определенную схемой, в другом контексте, например, для хранения данных в файлах или чего-то в этом роде).

Тем не менее: если вам нужен универсальный WSDL (потому что он требуется некоторым древним клиентам), вы всегда можете jax-ws сначала сгенерировать WSDL, а затем отредактировать его по своему усмотрению. Отредактированный WSDL можно включить с помощью параметра wsdlLocation аннотации @WebService.

person secra    schedule 01.07.2013
comment
Действительно, можно указать JAX-WS встроить схему. См. Мой ответ выше, чтобы узнать, как этого добиться. - person Kallja; 06.08.2013
comment
@Kallja: Я предположил, что OP имел в виду WSDL, сгенерированный сервером приложений (потому что в WSDL-фрагменте есть schemaLocation="http://localhost:8080/MyServcie/MyWs?xsd=1". Я не знаю способа убедить сервер приложений сгенерировать все-в-одном WSDL ... НО ваша точка зрения верна. Мне нужно вспомнить wsgen параметр, который вы использовали. :-) - person secra; 06.08.2013

Фактически невозможно использовать 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/sunseractor/withpoint/wholesale.java#L658

Существует также открытая проблема для JAX-WS, чтобы изменить это (но я думаю, что больше нет особых надежд на изменения в JAX-WS). https://github.com/eclipse-ee4j/metro-jax-ws/issues/49

person debuglevel    schedule 16.08.2019