2010년 1월 28일 목요일

CXF + JDK1.6 + Spring 개발 하기 Part3 (서버 개발하기)

Part1,Part2에서 CXF에 대한 설치를 설명 했습니다.
이번엔는 본격적으로 CXF 기반 웹 서비스 프로그래밍
에 대한 설명을 하겠습니다. ㅋㅋㅋ

예제는 본인이 서버면서 클라이언트 즉 본인이 서비스를
퍼플리싱 하고 본인이 서비스를 호출하는 예제 입니다.

  • 서버측에서 필요한 리소스
먼저 서버측에서 필요한 리소스에 대해서 설명 드리겠습니다.
서버측에서 필요한 리소스는 아래와 같습니다.

- 서비스 노출을 위한 interface
- 통신을 위한 도메인 클래스
- interface 구현체
- interface를 웹서비스 퍼블리싱 하기 위한 스프링 빈 설정 파일



  • 서비스 노출을 위한 interface

- Interface 선언부에 @WebService 어노테이션을 설정 합니다.
package org.beyond.j2ee;
import javax.jws.WebService;

@WebService
public interface SampleWS {
public SampleWSBean viewMember(SampleWSBean sampleWSBean) throws Exception ;

  • 통신을 위한 도메인 클래스
- 서버와 클라언트 통신 메세지는 도메인으로 합니다.
웹서비스가 메세지 기반을 자바로 변환을 하는데 아무래도
제약 사항이 존재 합니다. Map 클래스 또는 Inner Class는 지원이
되지 않습니다. 하지만 도메인 안에 도메인 또는 도메인 안에서
리스트형태는 가능 합니다.
필수 사항은 아니지만 습관적으로 "implements Serializable"를
선언 합니다.
package org.beyond.j2ee;

public class SampleWSBean implements Serializable {

private String id;

private String name;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

  • interface 구현체
일반 Pojo 클래스입니다.
@Webservice 어노테이션을 설정하고 구현할 인테페이스를 설정 합니다.
package org.beyond.j2ee;

@WebService(endpointInterface = "org.beyond.j2ee.SampleWS")
public class SampleWSImpl implements SampleWS {

private BaseDAO baseDAO;

public void setBaseDAO(BaseDAO baseDAO) {
this.baseDAO = baseDAO;
}

public SampleWSBean viewMember(SampleWSBean sampleWSBean) throws Exception {
return sampleWSBean;
}

}

  • 스프링 빈 설정 파일 (ws.xml)

http-conf : 클라이언트에서 호출할때 request timeout 설정
cxf 태그 : import resource 태그는 묻지마로 설정 하세요
jaxws: 이부분이 웹 서비스 노출 핵심 포인트
- id 속성 : 스프링 빈 아이디 입니다.
- implementor 속성 : 구현체 클래스 입니다.
사실 "org.beyond.j2ee.SampleWSImpl"라고 기술해야 하는데
여기서는 "#"을 붙인 이유는 스프링빈을 참고 하기 위한 것
입니다. 이렇게 해야 기존 스프링 서버스를 injection
할수 있습니다.
address 속성 : wsdl 주소 입니다.
여기서는 "http://localhost:8080/services/SampleWS?wsdl"
WSDL 주소가 됩니다.


<beans xmlns="http://www.springframework.org/schema/beans" xsi="http://www.w3.org/2001/XMLSchema-instance"
jaxws="http://cxf.apache.org/jaxws" conf="http://cxf.apache.org/transports/http/configuration"
schemalocation=" http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<http-conf:conduit name="*.http-conduit">
<http-conf:client connection="Keep-Alive"
maxretransmits="1" connectiontimeout="100000" receivetimeout="100000"
allowchunking="false" />
</http-conf:conduit>
<jaxws:endpoint id="SampleWS" implementor="#SampleWSImpl"
address="/SampleWS" />

<bean id="SampleWSImpl" class="org.beyond.j2ee.SampleWSImpl">
<property name="baseDAO" ref="baseDAO" />
</bean>
<bean id="baseDAO" class="org.beyond.j2ee.BaseDAO" />
</beans>

  • web.xml 설정 하기
여기까지가 웹 서비스 퍼플리싱 작업이 완료가 되었습니다.
마지막으로 web.xml에 아래와 같이 추가 합니다.
위에서 스프링 빈 설정파일을 셋팅하고 cxf 서블릿은 묻지마 설정하세요


<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/ws.xml
</param-value>
<!--param-value>classpath:/**/service-*.xml</param-value-->
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>


  • WDSL 확인
http://localhost:8080/services/SampleWS?wsdl로 접속하면 WSDL XML을
확인 할수 있습니다.

댓글 2개:

  1. ws.xml 작성하면 오류가 생기는데요?
    어떻게 해야하나요?

    답글삭제
  2. 안녕 하세요 말씀 하신 오류에 대해서
    좀더 구체적으로 말씀해 주세요.

    답글삭제