Подтвердить что ты не робот

Какой лучший плагин maven для создания клиента веб-сервиса?

Мне нужно создать WS-клиент, и я не могу решить, какой плагин использовать. До сих пор моими опциями были: jaxb2-maven-plugin, axistools-maven-plugin и jaxws-maven-plugin.

4b9b3361

Ответ 1

Мне нужно создать WS-клиент, и я не могу решить, какой плагин использовать. До сих пор моими опциями были: jaxb2-maven-plugin, axistools-maven-plugin и jaxws-maven-plugin.

Во-первых, jaxb2-maven-plugin на самом деле не предназначен для создания WS-клиентов. Устранен.

Во-вторых, лично Я бы не использовал Axis даже для разработки клиента, поэтому я не буду рекомендовать использовать axistools-maven-plugin. Устранен.

Это оставляет нас с помощью JAX-WS RI и стеков Apache CXF и их соответствующих плагинов Maven: JAX-WS Maven Plugin (инструкции по использованию JAX-WS Maven Plugin можно найти на странице Usage) и cxf-codegen-plugin.

Что касается плюсов и минусов, я бы подвел их следующим образом:

В конце концов, оба варианта достойны, поэтому я предлагаю немного просмотреть ссылки и сделать собственное мнение.

Ответ 2

Я использую jaxws-maven-plugin. На мой взгляд, JAX-WS является фактической стандартной реализацией для WS. Он имеет гораздо лучший сгенерированный код, чем AXIS, и проще конфигурировать и реализовывать. Он поддерживает Maven и Spring.

Создание клиентского кода из файла wsdl в pom.xml:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>generate-reports-ws-code</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>

<!-- This property is used to support having multiple <execution> elements. The plugin has, from some reason, only one timestamp file per the all executions, thus if you have two executions, it doesn't know exactly when to recompile the code. Here we tell it explicitly to have one timestamp file per each execution -->                            <staleFile>${project.build.directory}/jaxws/stale/.staleFlag.reports</staleFile>
                        <packageName>com.acme.reports.ws.api</packageName>
                        <wsdlDirectory>${project.build.directory}/wsdl</wsdlDirectory>
                        <wsdlFiles>
                            <wsdlFile>InternalReportsAPIService.wsdl</wsdlFile>
                        </wsdlFiles>
                        <verbose>true</verbose>
                        <sourceDestDir>${wsdl.generated.source.files.dir}</sourceDestDir>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Интерфейс для создания клиентской службы bean (это не сгенерировано автоматически):

public interface InternalReportsAPIServiceFactory {

    public InternalReportsAPIService createInternalReportsAPIService();

}

Его реализация bean:

public class InternalReportsAPIServiceFactoryBean implements InternalReportsAPIServiceFactory {

    private URL acmeReportsWsdlURL;

    private final static QName V1_QNAME = new QName("http://internal.reports.api.acme.net/v1","InternalReportsAPIService");

    @Override
    public InternalReportsAPIService createInternalReportsAPIService() {
        return new InternalReportsAPIService(acmeReportsWsdlURL, V1_QNAME);
    }

    public void setAcmeReportsWsdlUrl(String acmeReportsWsdlUrl) {
        try {
            this.acmeReportsWsdlURL = new URL(acmeReportsWsdlUrl);
        } catch (MalformedURLException ex) {
            throw new RuntimeException("Acme Reports WSDL URL is bad: "+ex.getMessage(), ex);
        }
    }
}

Идея в этом bean (используется как Spring bean) состоит в том, чтобы иметь одноэлементный код для генерации кода обслуживания клиента. Для этого требуется два входа: URL-адрес WSDL, то есть фактический URL-адрес сервера, который реализует WSDL. Код службы клиента при построении отправляет запрос на получение WSDL по указанному URL-адресу. Затем он создает WSDL на основе аннотаций, находящихся в автоматическом сгенерированном коде, и сравнивает его. Я считаю, что это сделано, чтобы убедиться, что вы работаете с правильной версией сервера. Итак, я поместил url в файл свойств, доступный для моего приложения, таким образом, я инициализирую в своем Spring контексте контекста приложения.

Здесь приведен пример использования factory для создания службы, а затем ее использования:

InternalReportsAPIService internalReportsAPIService = acmeReportsWSFactory.createInternalReportsAPIService();
InternalReportsAPI port = internalReportsAPIService.getInternalReportsAPIPort();

Здесь просто используйте переменную порта для вызова любой операции, доступной в wsdl.