Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

[SOAP] 웹서비스를 구축하여 보자!(apache cxf 사용?)

OpenSource/Apache CXF 2014.05.28 18:24
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

Webservice 유용 정의

http://www.ehow.com/info_12212371_definition-service-endpoint.html



위의 용어중에 endpoint라는 것이 있다.


기본적으로 consumer - provider 이런 용어가 있는데 

endpoint라는 친구는 provider에서 공개적으로 열어 놓는 것이다.


그래서 여기에서의 시나리오는 이러하다.


환경은 Spring + Maven 기반이고, 첫번째로 endpoint구성 후 soap UI라는 것을 통해 동작을 살펴보자.

두번째로는 아파치 cxf를 통해서 consumer에서 사용 할 stub code를 생성하자. 여기까지 해보겠다 ㅋㅋ 프록시를 만들어서 코드를 짜는 것은 우선 패스~~:D


자 시작해보자! ㅎㅎㅎ

1) web.xml 설정

   아래와 같이 Servlet설정을 해보자.


  <!-- cxf Webservice DispatcherServlce  -->

  <servlet>

         <servlet-name>CXFServlet</servlet-name>

          <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

   </servlet>

 

   <!--CXF Webservice Dispatcher Servlet Mapping -->

   <servlet-mapping>

          <servlet-name>CXFServlet</servlet-name>

          <url-pattern>/webservice/*</url-pattern>

   </servlet-mapping>


2) Spring 소스 설정

     아래와 같이 RndProvider.java(인터페이스) 와 구현체인 RndProviderImpl.java를 만들고

     context-webservice.xml을 생성하여 endpoint를 만들어보자.





RndProvider.java


RndProviderImpl.java


context-webservice.xml



우선 context-webservice.xml을 살펴보자.

<jaxws:endpoint id="rndProvider"

                              implementor="kr.pe.constr.webservice.RndProviderImpl"

                              address="/RndProvider" />


위의 부분이 endpoint의 설정부분이며 RndProviderImpl.java가 연결 되어져있다.


그런 다음 서버를 기동 하여 아래의 주소를 치면 WSDL의 주소가 나오게 된다.




클릭을 하게 되면 아래와 같이 wsdl이 생기게 된다. (http://localhost:9080/webservice/RndProvider?wsdl)




 그런 다음 soap ui를 통해 테스트 해보자. 우선은 다운로드!! http://www.soapui.org/



RndProviderImpl.java에서의 소스 내용은 아래와 같다.

@Override

public int acet(UserVo userVo) {

// TODO Auto-generated method stub

System.out.println(userVo.getId()+"====="+userVo.getName());

if(userVo.getId().equals("acet")){

   return 1000;

}

return 0;

}


그러므로 코딩에 의해서 0이 나오게 된다.


이제는 stub code를 apache cxf를 통해서 만들어보자.

우선 apache cxf를 셋팅하자.  

다운로드 : http://www.apache.org/dyn/closer.cgi?path=/cxf/3.0.0/apache-cxf-3.0.0.tar.gz


pom.xml에도 디펜던시를 추가해줘야 한다.

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-frontend-jaxws</artifactId>

            <version>${cxf.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-transports-http</artifactId>

            <version>${cxf.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-transports-http-jetty</artifactId>

            <version>${cxf.version}</version>

        </dependency>

참고 사이트 : http://svn.apache.org/viewvc/cxf/trunk/distribution/src/main/release/samples/java_first_spring_support/


cxf의 bin아래로 가서 다음의 명령어를 실행한다.

wsdl2java -client -p kr.pe.constr.webservice.consumer.stub -impl -validate -exsh false -dns true -dex true -wsdlLocation http://localhost:9080/webservice/RndProvider?wsdl -encoding UTF-8 -verbose -defaultValues -fe jaxws -db jaxb -wv 1.1 RndProvider.wsdl


명령어로 나온 소스를 아래와 같이 스프링쪽으로 옮겨준다.(단, 이 소스는 consumer쪽 소스이다!!)





단, RndProviderImplService.java에서 아래의 오류나는 부분은 삭제를 한다.




프록시를 하나 만들어서 원하는 아파치 cxf를 통해 나온 stub 코드를 통해 consumer에서 provider에서 열어놓은 endpoint쪽을 접근해 실행 시킨다.


참고 사이트 : http://cxf.apache.org/docs/writing-a-service-with-spring.html


     - END -

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions

OpenSource/Apache CXF 2013.09.04 10:22
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



<< 환경 >>

환경 : jboss-eap-5.1, jdk1.6.0_31, apache cxf 2.6.2

 

위의 환경속에서~~~~

vo(value object)에 Locale 라는 type으로 생성 하였다.

 

VO 안의 내용(기본적인 getter, setter가 있는 vo)

 

   private Locale userLocale;

 

   public Locale getUserLocale() {
        return userLocale;
    }

    public void setUserLocale(Locale userLocale) {
        this.userLocale = userLocale;
    }

 

<< Error 발생 >>

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.util.Locale does not have a no-arg default constructor.
 this problem is related to the following location:
  at java.util.Locale
  at private java.util.Locale kr.pe.acet.vo.aaa.userLocale
  at kr.pe.acet.vo.aaa
  at private kr.pe.acet.vo.aaa

  kr.pe.acet.vo.resource.bbb.domain.xxxxVo.aaa
  . . . . . .

 

 Webservice쪽에서 나고 있었다.(Provider쪽)

 

<< 해결 흐름 >>

모든 사람들이 입을 모아 default construct가 없으니 오류가 난다

개발자 A : private Locale userLocale=null;

그냥 null로 초기화를 해주면 된다며..J2EE, Spring..머라머라하는데 무슨말인지 아직도 이해가 가질 않는다ㅋ;

※ null로 초기화 해주었지만 되지 않았다....-_-;;

 

그래서 생성자를 통해 초기화를 해주기로 하였다.

ex) 생성자를 통한 초기화

public aaa(){  // 나는야 생성자~~
   userLocale = new Locale("en", "US"); // 미리 생성!
}

 

헉..이것 또한 같은 오류가 발생 하였다.

 

그래서 구글링을 해보았다.

cxf쪽과 jboss쪽에서 위와같은 Bug성 오류가 났었고 이것을 jira에 올려져있는 것을 알수 있었다. 

Thus, you would need to specify an XmlJavaTypeAdapter to map the Locale object to something that is jaxb/schema compliant.  XmlJavaTypeAdapter 요런게 필요하다고 말하고 있다..

 

참고 사이트(구글링)

   https://issues.apache.org/jira/browse/CXF-3386

   jboss관련 사이트도 있는데 별내용 없어서...링크는 pass~

 

그리고 더욱 더 웃낀 것은...

jboss 대신 apache-tomcat을 사용하였을 경우에..오류가 나지 않았다!!

환경 : apache-tomcat-6.0.32 , jdk1.6.0_31, apache cxf 2.6.2

 

결국 jboss위에서 돌려야하기 때문에 아래의 사이트를 참고하여 수정하였다. 아래의 소스는 오류가 난다;;

http://stackoverflow.com/questions/2522248/how-to-get-locale-from-its-string-representation-in-java

 

<< vo에 추가한 해결 소스 >>

더보기

 

 

   중요 팁!!  : 위의 소스에서 messageConverter를 사용한다면 getter쪽에서 Locale을 생성하면 안된다.

더보기

 

- 끝 -

 

 

 

 

 

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Webservice 기초

OpenSource/Apache CXF 2013.02.25 10:37
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T




출처 : http://ws6263.blog.me/100156628436

More Detail하게 알아보자^^
출처 : http://ko.wikipedia.org/wiki/SOAP



SOAP

SOAP(Simple Object Access Protocol)은 일반적으로 널리 알려진 HTTP, HTTPS, SMTP 등을 사용하여 XML 기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 형태의 프로토콜이다. SOAP은 웹 서비스(Web Service)에서 기본적인 메시지를 전달하는 기반이 된다. SOAP에는 몇가지 형태의 메시지 패턴이 있지만, 보통의 경우 원격 프로시져 호출(Remote Procedure Call:RPC) 패턴으로, 네트워크 노드(클라이언트)에서 다른 쪽 노드(서버)쪽으로 메시지를 요청 하고, 서버는 메시지를 즉시 응답하게 된다. SOAP는 XML-RPC와 WDDX에서 envelope/header/body로 이루어진 구조와 전송(transport)와 상호 중립성(interaction neutrality)의 개념을 가져왔다.

Acet-T : 웹서비스가 통신(메시지 전달)하기 위한 프로토콜로..HTTP, HTTPS, SMTP 등을 사용하여 메시지를 교환 하며, 내부 메시지는 xml 형태 이다. 구조는 envelope/header/body 로 되어있다.
<<그림>>



밑에 나오는 xml 형태의 soap example

더보기



역사

SOAP는 'Simple Object Access Protocol'의 약어를 의미하지만, 버전 1.2 표준에서부터는 그 의미가 퇴색되었다. 2003년 6월 24일, W3C에서 버전 1.2 권고안이 나왔으며, 서비스 지향 아키텍처(SOA:Service-oriented architecture)와 그 의미가 종종 혼용된다. 그러나 엄연히 SOAP와 SOA는 다르다. SOAP는 데이브 위너(Deabe Winer), 돈 박스(Don Box), 밥 액킨슨(Bob Atkinson) 그리고 모슨 얼 고세인(Mohsen Al-Ghosein)들에 의해 1998년 마이크로소프트(액킨슨과 얼 고세인이 그 당시 일하고 있던)의 후원으로 객체 접근 규약(Object Access Protocol)로서 처음으로 디자인되었다. SOAP의 표준화 작업은 현재 W3CXML protocol Working Group 쪽에서 관리를 하고 있다.

전송 방식

SOAP인터넷 애플리케이션 계층에 있는 프로토콜을 전송계층의 프로토콜로 사용할 수 있게 만든다. 혹자[누가?]는 이러면 프로토콜의 의도된 목적과 역할이 맞지 않아 부정 이용이 된다고 비판하지만, SOAP의 지지자들은 터널링을 위한 다양한 계층(level)에 쓰이고 있는 다른 프로토콜들과 비슷하다고 말하고 있다. SMTPHTTP에서 애플리케이션 계층 프로토콜로 트랜스포트 계층의 역할을 대신하는 것이 SOAP의 올바른 이용이라 할 수 있으나, HTTP는 오늘날 인터넷 인프라와 매우 잘 동작하여 더욱 폭넓은 지원을 가능하게 한다. 특히나, HTTP는 방화벽이 작동하는 네트워크 안에서도 문제 없이 작동한다. SOAP는 HTTPS(애플리케이션 계층에서는 HTTP와 동일하나 트랜스포트 계층 아래에서는 암호화됨)에서도 간략하게 또는 상호적으로 사용된다.

이는 WS-I방식으로 Basic Profile 1.1에서 서술된 것과 같이 웹 서비스의 보안을 제공하고 있다. 이 점은, GIOP/IIOP 혹은 DCOM 등과 같은 방화벽에서 쉽게 필터링 당하는 여타의 배포 프로토콜등과의 비교 우위를 점하고 있다.

메시지 형식(XML 형식)

XML은 대다수 회사들과 오픈 소스 개발 진영의 노력에 힘입어 광범위하게 사용되는 메시지 형식이므로 표준으로 선택되었다. 게다가 광범위하게 무료로 사용 가능한 툴이 상당수 포진하고 있는 점은 SOAP-기반 구현으로 옮겨가기 쉽게 하였다. XML의 문법은 다소 긴데, 이에는 장단점이 있다. 사람이 쉽게 읽을 수 있는 반면, 불필요한 정보때문에 처리속도가 늦어질 수 있다. CORBA, GIOP, ICE, DCOM은 이진 메시지 포맷을 사용하므로 전송량이 훨씬 적다. 그러나 XML 메시지 처리는 하드웨어로 빠르게 할 수 있다.[1][2] 이진 XML은 스트리밍 전송에 대한 대안으로 (속도를 높이는 수단으로) 검토되고 있다.

장단점 비교

다양한 비평자들과 전문가들이 기술적인 대안과 the context of its intended use에 대하여 SOAP의 기술적인 장단점들에 대한 토의가 있어왔다.

장점

  • SOAP를 사용한 HTTP는 기존 원격 기술들에 비해서 프록시와 방화벽에 구애받지 않고 쉽게 통신 가능하다.[출처 필요]
  • SOAP는 융통성있게도 각각 다른 트랜스포트 프로토콜들의 사용을 허용하고 있다. 표준 스택에서는 트랜스 포트 프로토콜로 HTTP를 사용하지만, 다른 프로토콜 역시 사용가능 하다.
  • SOAP는 플랫폼 독립적이다.
  • SOAP는 프로그래밍 언어에 독립적이다.
  • SOAP 간단하고, 확장가능하다.

단점

  • XML 포맷은 태그 형태로 보내기 때문에 CORBA같은 미들웨어 기술과 비교해서 상대적으로 느리다. 이것은 전송할 메시지가 적을때에는 문제 되지 않을 수 있다. 성능을 향상시키기 위해서 바이너리 객체를 포함시킨 특별한 경우의 XML(바이너리 XML을 말하는듯)로 메시지 전송 최적화 메커니즘(Message Transmission Optimization Mechanism; MTOM)이 나왔다. 게다가 일반적인 XML의 성능을 향상시키기 위해, VTD-XML과 같은 emerging non-extractiv XML 처리 모델이 있다.

SOAP 샘플

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
     <getProductDetails xmlns="http://warehouse.example.com/ws">
       <productId>827635</productId>
     </getProductDetails>
   </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
 
UDDI
 
UDDI(Universal Description, Discovery and Integration)는 웹 서비스 관련 정보의 
공개와 탐색을 위한 표준이다(???What the..zz)
. 위에서 정의 되어 있는 것을 보면..
웹서비스를 등록, 검색 할 수 있는 등록 저장소 라고 한다.


서비스 제공자는 UDDI라는 서비스 소비자에게
이미 알려진 온라인 저장소에 그들이 제공하는 서비스 목록들을 저장하게 되고,
서비스 소비자들은 그 저장소에 접근함으로써 원하는 서비스들의 목록을 찾을 수 있게 된다.
UDDI 비즈니스 등록은 다음과 같이 세 가지 구성요소를 갖는다.
  • 화이트 페이지(White Pages) — 주소, 연락처 등의 알려져 있는 식별자
  • 옐로 페이지(Yellow Pages) — 표준 분류법을 기반으로 한 산업 분류
  • 그린 페이지(Green Pages) — 비즈니스를 통해 노출된 서비스에 대한 기술 정보
 음...UDDI는 개념으로 봤을 때는 scope가 큰 것 같다.
보통 내부 시스템이라던지 B2B 간의 웹서비스를 통한 통신을 하게 되는데 있어서..
UDDI가 쓰이는지는 현재 구축되어진 것을 봐야 할 것으로 생각 된다.
WSDL
WSDL(Web Services Description Language의 약자)은 웹 서비스 기술언어 또는 기술된 정의 파일의
총칭으로 XML로 기술
된다. 웹 서비스의 구체적 내용이 기술
1) 서비스 제공 장소
2) 서비스 메시지 포맷
3) 프로토콜 등이 기술
WSDL 2.0 문서의 구조:

더보기

출처 : http://ko.wikipedia.org/wiki/WSDL
 
저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Apache CXF???

OpenSource/Apache CXF 2012.11.16 10:01
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

http://cxf.apache.org/

Overview


Apache CXF is an open source services framework.

CXF helps you build and develop services using frontend programming APIs, like JAX-WS and JAX-RS
* frontend : 사용자가 직접이용하는

These services can speak a variety of protocols such as SOAP, XML/HTTP, RESTful HTTP, or CORBA and work over a variety of transports such as HTTP, JMS or JBI.


Features


CXF includes a broad feature set, but it is primarily focused on the following areas:
     * primarily : 주된, 주요한

  • Web Services Standards Support: CXF supports a variety of web service standards including SOAP, the WS-I Basic Profile, WSDL, WS-Addressing, WS-Policy, WS-ReliableMessaging, WS-Security, WS-SecurityPolicy, WS-SecureConverstation, and WS-Trust (partial).
  • Frontends: CXF supports a variety of "frontend" programming models.

CXF implements the JAX-WS APIs. CXF JAX-WS support includes some extensions to the standard that make it significantly easier to use, compared to the reference implementation: It will automatically generate code for request and response bean classes, and does not require a WSDL for simple cases. // 음..자동적으로 bean classes 코드가 제공 되어지고, WSDL 이 요구되지 않는다고 한다. 간단 케이스를 위한? 음..무슨말인지는 잘모르겠지만..그렇다고 한다--;;

It also includes a "simple frontend" which allows creation of clients and endpoints without annotations. CXF supports both contract first development with WSDL and code first development starting from Java.

For REST, CXF also supports a JAX-RS frontend.

  • Ease of use: CXF is designed to be intuitive and easy to use. There are simple APIs to quickly build code-first services, Maven plug-ins to make tooling integration easy, JAX-WS API support, Spring 2.x XML support to make configuration a snap, and much more.
  • Binary and Legacy Protocol Support: CXF has been designed to provide a pluggable architecture that supports not only XML but also non-XML type bindings, such as JSON and CORBA, in combination with any type of transport.

To get started using CXF, check out the downloads, the user's guide, or the mailing lists to get more information!

보는 중~~~~ 입니다--;;

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바