복붙노트

[SPRING] Apache CXF + Spring : 간단한 클라이언트 생성

SPRING

Apache CXF + Spring : 간단한 클라이언트 생성

나는 Spring에서 Apache CXF를 배우기 시작했다. 우선, 나는 간단한 클라이언트 / 서버 모델을 만들려고 노력했다.

서버 쪽 : 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     public class 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-client-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 (package + interface)를 클라이언트 프로젝트에 추가해야한다는 것입니다. 서비스를 사용하기 전에 스텁을 생성해야한다고 들었습니다. 그래서 나에게 혼란 스럽다. 그래서 올바른 접근법과 최선의 실행 방법은 무엇입니까? (계약 우선 접근법 등을 사용하는 것이 더 좋을 수 있습니다)? 나중에 WS-Security를 ​​추가하고 싶습니다. 강력한 배경이 필요합니다 =)

미리 감사드립니다.

해결법

  1. ==============================

    1.코드 우선 WS 개발을한다면 인터페이스를 배포하고 클라이언트에게 제공하는 것이 좋습니다. 나는 @WebService가 인터페이스 (단지 구현)에 필요하지 않다고 (?) 믿는다. 그래서 클라이언트는이 주석에 의존하지 않는다.

    코드 우선 WS 개발을한다면 인터페이스를 배포하고 클라이언트에게 제공하는 것이 좋습니다. 나는 @WebService가 인터페이스 (단지 구현)에 필요하지 않다고 (?) 믿는다. 그래서 클라이언트는이 주석에 의존하지 않는다.

    코드 우선 웹 서비스를 수행하는 경우에도 Apache CXF에서 생성 한 WSDL 문서를 다운로드하여 대신 클라이언트에 제공 할 수 있습니다. 이 접근법 (.NET과 같은 다른 플랫폼에서 사용될 수 있음은 물론 더 성숙한 것으로 간주 됨)을 사용하여 클라이언트는 (wsdl2java와 같은 도구를 사용하여) 스텁을 생성해야합니다. 이 프로세스는 기본적으로 매우 유사한 클라이언트 인터페이스를 자동으로 생성합니다.

    이는 많은 사람들이 계약 우선 개발을 선호하는 이유 중 하나입니다. 동일한 WSDL이 클라이언트 측 스텁 및 서버 측 WS 구현을 생성하는 데 사용됩니다. 이것은 (우발적 인) 비 호환성의 범위를 제한합니다.

  2. ==============================

    2.클라이언트 측에서 이와 같이 간단한 스프링 구성을 사용할 수 있습니다.

    클라이언트 측에서 이와 같이 간단한 스프링 구성을 사용할 수 있습니다.

    <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. from https://stackoverflow.com/questions/9032960/apache-cxf-spring-generating-a-simple-client by cc-by-sa and MIT license