본문 바로가기
슬기로운 자바 개발자 생활/스프링 및 자바웹 서비스

(웹서비스 구현) 자바 웹서비스/Wsdl/CXF 심플 (예제)

by 슬기로운 동네 형 2017. 9. 10.
반응형

speringwebclient.zip
다운로드
springwebservice.zip
다운로드

 

옆에 나열한 개념들을 대충 구글링해서 찾아보면 수월하게 작업 할 수 있습니다. => SOA, 웹서비스, XML, wsdl

 

* was(톰캣, 웹로직, 제우스)에서 제공하는 웹서비스관련 jar들과 충돌 즉. 자신의 프로젝트 jar들끼지 의존이 되어야 하는데 was 쉐어드..가 부분적으로 로딩될 수 있다. 이럴때는 was 가이드별를 참고해서 자신의 프로젝트 구성으로만 우선 로딩할 수 있게 해야한다. 

 

간단하게~~~ 서비스와 클라이언트를 CXF를 이용해서 만들어 본다.

(axis2, CXF, spring WS) 등이 있는데... 간단하게 구글링해보니 CXF가 가장 간단한거 같다. 각 was 에서 쌩짜로 짜면 힘듭니다. axis는 구성이 잘 되지 않네요.

  자바 1.7, 1.8 별로 cxf 버전도 맞춰야 하니 한번쯤 CXF 아파치 사이트가서 버전별 도움말 읽어 보길 추천 합니다.

 

 

우선 초간단 웹서비스 먼저 구성

 

개발환경이 톰캣 7 (2개 사용) , 자바 6, Spring, 이클립스 

 

1. CXF바이너리 파일 다운로드, 이클립스 설정

 

D:\apache-cxf-2.6.2\apache-cxf-2.6.2 바이너리 파일 다운받아 D:\ 에 설치. 따로 패스설정은 안했다.

 

시간이 좀 지났고 유행이 지나서 약간 예전 버전을 사용해서 웹서비스를 구현해본다.

https://archive.apache.org/dist/cxf/2.6.2/ 바이너리 파일 다운받아 압축 풀기

 

 

이클립스에서 run을 서치 server and Runtime 의 웹서비스를 CXF 2.x로 설정

 

 

웹서비스를 검색 cxf 2 Preferences 에서 CXF runtime 패스를 설정

cxf 2.6.2 바이너리 압축파일 푼 폴더를 잡아 준다.

 

 

2. 스프링 웹 프로젝트 설정

(pom.xml , web.xml, context, 서비스하고자 하는 java)

 

2-1. pom.xml cxf 메이븐 추가

  <!-- cxf -->
  <dependency>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-rt-frontend-jaxws</artifactId>
   <version>2.6.2</version>
  </dependency>
  <dependency>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-rt-transports-http</artifactId>
   <version>2.6.2</version>
  </dependency>

  <dependency>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-rt-frontend-jaxrs</artifactId>
   <version>2.6.2</version>
  </dependency>

  <dependency>
   <groupId>wsdl4j</groupId>
   <artifactId>wsdl4j</artifactId>
   <version>1.6.2</version>
  </dependency>

 

2-2. context 추가 (빨간색부분이 자바 interface, class 구현)

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
 xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:util="http://www.springframework.org/schema/util" xmlns:cxf="http://cxf.apache.org/core"
 xsi:schemaLocation="
  http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
  http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">

 <!-- REST -->
 <import resource="classpath:META-INF/cxf/cxf.xml" />
 <import resource="classpath:META-INF/cxf/osgi/cxf-extension-osgi.xml" />

 <!-- SOAP -->
 <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
 <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

 <context:component-scan base-package="com.spring.test" />

 

 <jaxws:endpoint id="deptProcess"
  implementor="com.spring.test.webservice.DeptProcessImpl" address="/DeptProcess" />
  
</beans>

 

 

2-3. 빨간색 부분을 참고 

web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

 <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
  /WEB-INF/spring/root-context.xml
  /WEB-INF/spring/appServlet/context-cxf.xml
  </param-value>
 </context-param>
 
 <!-- Creates the Spring Container shared by all Servlets and Filters -->
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

 <!-- Processes application requests -->
 <servlet>
  <servlet-name>appServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
  
 <servlet-mapping>
  <servlet-name>appServlet</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>

 

 <servlet>
   <servlet-name>cxf</servlet-name>
   <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
   <load-on-startup>2</load-on-startup>
 </servlet>
 <servlet-mapping>
   <servlet-name>cxf</servlet-name>
   <url-pattern>/webService/*</url-pattern>
 </servlet-mapping>

 

 <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>
   org.springframework.web.filter.CharacterEncodingFilter
  </filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
   <param-name>forceEncoding</param-name>
   <param-value>true</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
</web-app>

2-4. DeptVo, DeptProcess, DeptProceeImpl 부서정보를 리턴하는 웹서비스

 

2-4-1 . DeptVo.java

 

 

2-4-2 . DeptProcess.java  

 

import java.util.List;
import javax.jws.WebService;
import com.spring.test.DeptVo;

 

@WebService
public interface DeptProcess {
 List<DeptVo> processDept();
}

 

2-4-3. DeptProcessImpl.java

 

import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import com.spring.test.DeptVo;

@WebService(endpointInterface = "com.spring.test.webservice.DeptProcess")
public class DeptProcessImpl implements DeptProcess {

 @Override
 public List<DeptVo> processDept() {
  
  System.out.println("!!!!!!!!!!!!!! 웹서비스를 호출합니다. !!!!!!!!!!!!!!");
  List<DeptVo> deptVos = new ArrayList<DeptVo>();
  
  for(int i=0; i <20 ;i++) {
   DeptVo deptVo = new DeptVo();
   deptVo.setDeptName("부서명"+i);
   deptVo.setDeptNo(i);
   deptVo.setLocation("부서지역"+i);
   deptVos.add(deptVo);
  }
  return deptVos;
 }
}

 

3. 톰캣에 프로젝트를 배치 하고 실행 해본다.

http://localhost:8080/webService

http://localhost:8080/webService/DeptProcess?wsdl

 

wsdl이 만들어 졌다

 

web.xml에 설정한 cxf의 url패턴의 주소

 <servlet>
   <servlet-name>cxf</servlet-name>
   <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
   <load-on-startup>2</load-on-startup>
 </servlet>
 <servlet-mapping>
 
   <servlet-name>cxf</servlet-name>
   <url-pattern>/webService/*</url-pattern>
 </servlet-mapping>

 

 

 

wsdl 파일은 서두에 설명한 SOA, WEB SERVICE 키워드로 구글링 하면 많은 자료가 나옴.

 

간단한 건데...하루 종일 헤맸네요...

클라이언트 구현은 다음 글에~~~

 

테스트 소스 첨부함

 

 

 

 

 

 

 

반응형

댓글