Apache CXF + Spring: создание простого клиента - PullRequest
6 голосов
/ 27 января 2012

Я начал изучать Apache CXF с Spring. Прежде всего, я попытался создать простую модель клиент / сервер.

На стороне сервера: service.HelloWorld.java

@WebService
public interface HelloWorld {
  String sayHi(String text);
}

service.HelloWorldImpl.java

@WebService(endpointInterface = "service.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
   public String sayHi(String text) {
     return "Hello, " + text;
   }
}

Клиентская сторона: client.Client.java Открытый класс Client {

    public static void main(String[] args) {
          ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new  String[] {"cxf-client-servlet.xml"});
          HelloWorld client = (HelloWorld) context.getBean("client");
          System.out.println(client.sayHi("Batman"));
    }
}

CXF-клиент-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://cxf.apache.org/jaxws
    http://cxf.apache.org/schema/jaxws.xsd">

<bean id="client" class="service.HelloWorld" factory-bean="clientFactory" factory-method="create"/>

<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
    <property name="serviceClass" value="service.HelloWorld"/>
    <property name="address" value="http://localhost:8080/services/HelloWorld"/>
</bean>

Проблема в том, чтобы заставить клиента работать, мне пришлось добавить service.HelloWorld (пакет + интерфейс) в проект клиента. Я слышал, что перед использованием сервиса мне нужно создать заглушку. Так что это сбивает с толку меня. Итак, каков правильный подход и какова лучшая практика (может быть, лучше использовать какой-то контрактный подход или что-то подобное)? Позже я хочу добавить WS-Security, поэтому мне нужен сильный фон =)

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 28 мая 2014

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

<jaxws:client id="mywebServiceClient"
    serviceClass="com.saurzcode.TestService"
    address="http://saurzcode.com:8088/mockTestService">

    <jaxws:binding>
        <soap:soapBinding version="1.2" mtomEnabled="true" />
    </jaxws:binding>
</jaxws:client>
<cxf:bus>
    <cxf:outInterceptors>
        <bean class="com.saurzcode.ws.caller.SoapHeaderInterceptor" />
    </cxf:outInterceptors>
</cxf:bus>

Игнорировать перехватчик, если он вам не нужен..

3 голосов
/ 27 января 2012

Если вы занимаетесь разработкой WS-кода в первую очередь, тогда можно распространить интерфейс и передать его клиенту. Я считаю, что @WebService не требуется (?) Для интерфейса (только реализация), поэтому у клиента нет зависимостей от этой аннотации.

Даже если вы работаете с веб-службами, использующими код, вы все равно можете загрузить документ WSDL, сгенерированный для вас Apache CXF, и вместо этого передать его клиенту. При таком подходе (который считается более зрелым, не говоря уже о том, что он может использоваться на разных платформах, таких как .NET), клиент должен генерировать заглушки (используя инструмент, подобный wsdl2java). Этот процесс автоматически создаст очень похожий интерфейс клиента.

Это одна из причин, по которой так много людей предпочитают разработку на основе контракта - один и тот же WSDL используется для создания заглушек на стороне клиента и реализации WS на стороне сервера. Это ограничивает область (случайных) несовместимостей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...