블로그 이미지
올해목표 // 10월 어학연수 떠나자~ 자수씨

카테고리

전체글 (1457)
Brand New! (28)
주절주절 (213)
MOT (11)
해외쇼핑 (49)
쇼핑노트 (150)
취미생활 (94)
iPhone (4)
Eclipse (121)
Google (83)
Spring (31)
JAVA (176)
Ant (2)
Maven (29)
iBATIS (7)
Regular Expression (6)
Java Web Start (4)
WebServices (14)
JAXB (12)
CAS (13)
JBoss Seam (6)
OSGi (1)
Hibernate (2)
James (6)
Alfresco (17)
JavaScript (59)
WEB (49)
Database (20)
OS (26)
Tools (8)
Tips (26)
IT정보 (1)
Book (21)
Programming (37)
외부행사 (43)
주변인들 (17)
여행노트 (60)
학교생활 (30)
회사생활 (52)
사회생활 (5)
외국어공부 (12)
잡동사니 (30)
Total
Today
Yesterday
 
04-17 10:14
 

달력

« » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
 

최근에 올라온 글

최근에 달린 댓글


JAX-WS 에서 웹 서비스를 호출하니 아래와 같은 오류로 실패하였습니다...

Invalid byte 2 of 4-byte UTF-8 sequence


구글링을 해보니 클라이언트 쪽에 인코딩 설정을 해야 한다는 말이 있어서 실행옵션에 "-Dfile.encoding=UTF-8" 를 주고 했더니 잘 됩니다. 근데 다시 빼고 해도 잘되네요... 뭐지;;;

여튼 해결~


참고자료: http://community.jboss.org/message/545017


 

Posted by 자수씨
, |

웹 서비스 클라이언트를 가장 빨리 테스트 할 수 있는 방법은 이클립스에서 Apache Axis 를 이용한 클라이언트를 제너레이션 하여 테스트하는 것 입니다.

하지만 HTTP Authentication 인증 처리는 자동화해주지 않기 때문에 제너레이션된 소스에 별도의 수정이 필요합니다.

생성된 클래스 중 [ServiceName]Location.java 파일이 있을 것 입니다.
저의 경우에는 WorkflowWebServicesserviceName 이기 때문에 WorkflowWebServicesLocator.java 파일을 수정하였습니다.


getWorkflowWebServicesPort(java.net.URL portAddress) 메소드에서 생성된 stub 에 username 과 password 프로퍼티를 설정하는 것입니다.
_stub._setProperty(_stub.USERNAME_PROPERTY, "vicki");
_stub._setProperty(_stub.PASSWORD_PROPERTY, "vickivicki");

위와 같이 username 과 password 를 설정하면.... HTTP 인증 절차도 통과가 됩니다.

유후~~

오늘 웹 서비스만 너무 많이 파고 들어간거 같네요... 힘이 듭니다. 털썩...

Posted by 자수씨
, |

역시나 한방에 재대로 되는 것은 없는 것 같습니다.
Spring-Webservices 를 통해서 구현된 웹서비스인데 JDK 6 + Tomcat 6.x 환경에서는 무리없이 돌아갔으나
앞에서의 무수한 역경을 헤치고 나왔으나 또 문제가 발생합니다.

이번에는 아래와 같은 문제를 뿜어내었습니다.
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 
[your interface] is an interface, and JAXB can't handle interfaces.
        this problem is related to the following location:
                at [your interface]
[your interface] does not have a no-arg default constructor.
        this problem is related to the following location:
                at [your interface]

당연히 인터페이스는 생성자를 갖을 수 없습니다. 하지만 spring framework 의 DI 를 이용하다보니 인터페이스를
통해 파라미터를 넘기기에... 문제가 발생하는 것이었습니다.



apt 툴을 통해서 생성된 웹메소드 구현체와 Response 파일에서 인터페이스가 파라미터로 넘어가는 경우에서 발생하는 것인데
발생되는 메소드가 웹메소드도 아니고 스프링에서 사용하는 setter 메소드여서 [java.net forum 검색] 을 통해 해결책을 찾았습니다.

사용되지 않는 메소드에 아래와 같은 Annotation 을 설정해줍니다.
@WebMethod(exclude = true)



후훗... 잘 됩니다. 원래 어제 새벽에 저렇게 했었는데 재대로 갱신을 안해서 -_ㅜ...

여튼 이제 실서버에 배포할 일만 남았다습니다~ ㅋㅋㅋ





Posted by 자수씨
, |

앞에서 javax.xml.stream.supportDTD 에 접근까지는 해결했으나 클래스를 찾을 수 없다는 익셉션이 발생하였습니다.

이 문제는 라이브러리만 추가하면 되기에~~


[JAX-WS HOME] 으로 이동하여 최신 바이너리를 다운받습니다.
Download NOW 2.1.5 버튼을 Click!! 합니다.


다운 받은 jar 파일을 아래의 명령을 통해 실행시키거나 더블클릭을 하면 간단한 절차를 마치고 압축이 풀리게 됩니다.
(윈도우에서 jar 파일의 실행이 java 로 연결된 경우에만 더블클릭이 가능합니다.)
java -jar JAXWS2.1.5-20081030.jar

그 중에서 아래의 jar 파일들을 [your webapps]/WEB-INF/lib 에 복사를 합니다.
  • stax-ex.jar
  • streambuffer.jar
  • jaxws-rt.jar
  • jaxws-api.jar
  • jaxb-api.jar
  • jaxb-impl.jar

이제 ClassNotFoundException 은 보이지 않습니다~
하지만 다른 오류를 뿜어내는 Weblogic 입니다...




Posted by 자수씨
, |

예전에 만들었었던 웹서비스가 AIX + IBM JDK + Weblogic 9.2 에서 돌아가지 않고 이상한 익셉션을 뿌려대었습니다.

java.lang.IllegalArgumentException: Unable to access unsupported property javax.xml.stream.supportDTD

JDK 6 + 톰캣 6.x 에서는 문제없이 돌아가던 내 웹서비스가...

역시 웹서비스 관련 자료는 국내에 거의 없었습니다. 구글과 함께 문제를 해결하기 위해 JCO 를  보다가 찜찜해서
회사로 뛰쳐들어와서 해결책을 찾기 시작하였습니다.

[검색자료]를 통해서 어느정도 해결책을 찾은 것 같았는데... 도대체 weblogic-application.xml 을 어디에 두어야 할지를
찾을 수가 없었습니다.

그것의 답은 [해당링크] 를 통해 확인할 수 있었습니다.

[your webapps]/META-INFO/weblogic-application.xml




이젠 다른 오류를 뿜어댑니다. ㅋㅋㅋ
다음을 처리하러 고고싱~


Posted by 자수씨
, |

오늘 실서버에 배포를 하다보니... 실서버는 ethernet 이 4개나...

그전에 만들었던 LocalJaxWsServiceExporter 로는 맨처음 걸린 ethernet 의 아이피로만 배포가 되었습니다.
참고링크: 2008/11/24 - [JAVA/WebServices] - [Spring MVC] SimpleJaxWsServiceExporter 수정~


그래서 시스템의 모든 ethernet 컨트롤러를 조사하여 각각의 endpoint 로 배포하는 것을 맹글어 보았습니다.


InetAddress 로는 한계가 있기에 NetworkInterface 클래스를 이용하여 처리를 하였습니다.
참고자료: http://www.cowtowncoder.com/blog/archives/2007/05/entry_35.html

_M#]
나중에 java.net 패키지의 클래스들을 정리해봐야겠습니다.
유용한 것들이 많네요~




Posted by 자수씨
, |
org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter 를 이용하여 웹서비스를 등록할경우 호스트를 하드코딩해야 해서 개발과 운영서버에 각각의 아이피를 적어줘야 하는 불편함이 있었습니다. 그래서 초큼 수정해보았습니다.

LocalJaxWsServiceExporter.java


스프링 설정



과연 국내에서 Spring 으로 웹서비스하는 사람은 나밖에 없는건가 -_ㅜ... 검색을 해도 안걸리네...




Posted by 자수씨
, |

스프링프레임워크에서 제공해주는 SimpleJaxWsServiceExporter 로는 한 컨텍스트 내에서 한 개의 서비스밖에
배포를 못하는 것으로 확인되었습니다. (저의 테스트 결과로는...)

그래서 스프링쪽 클래스를 참고해서 다중 Exporter 를 만들어보았습니다.



음... 이제는 실제로 배포할 경우 baseAddress 에 대해서 고민 좀 해야할 것 같습니다.

Posted by 자수씨
, |

첨부파일을 JAX-WS 에서는 어떻게 넘길가가 궁금해서 한번 도전해보았습니다.
무모한 도전의 결과는 무한삽질의 반복이...
여튼 어느정도 성공을 한 듯 합니다. ㅋㅋㅋㅋ

ㅁ Server Side
kr/co/vicki/webservices/conf/uploadWebservicesContext.xml


WEB-INF/web.xml


kr.co.vicki.webservices.webservice.UploadWebService.java


  - @MTOM: binary attachment 전송을 위한 어노테이션
  - @SOAPBinding(style = SOAPBinding.Style.RPC)... 이건 무슨 말인지 모르겠습니다. 
    아래와 같은 설명이 어딘가에 있더라구요... 해석이 딸리므로... 읽으시는 분께 맡기겠습니다.
    그러나 해당 어노테이션이 정의되어 있지 않으면 클라이언트쪽에서 제너레이션 된 메소드의 파라미터가
    byte[] 이 아닌 DataHandler 가 되므로 일단 어노테이션을 위와 같이 설정합니다.
No, this is specified by the SOAPBinding annotation on the service class. Notice this in the original post above:

@SOAPBinding(style = SOAPBinding.Style.RPC)

This is telling wsgen that this is an rpc/literal service. A document/literal (doc/lit) service is specified thusly:

@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)

Actually, things are a little more complicated. This is actually specifying a doc/lit/wrapped service, meaning that the SOAP message body can contain multiple parameters. By contrast, in a doc/lit/bare service, the SOAP message body can contain only one parameter. For all the gory details, see the Annotations section of the JAX-WS User's Guide. 




ㅁ Client Side
kr/co/vicki/client/conf/webservicesContext.xml



kr/co/vicki/client/Client.java


서버의 public void fileUpload(String filename, DataHandler handler) 메소드는
클라이언트에서 public void fileUpload(String filename, byte[] arg1) 로 제너레이션 됩니다.
파일을 byte[] 로 변환하여 파일명과 함께 넘겨주게 되면 서버쪽에서 inputStream 으로 접근이 가능하게 됩니다.

첨부파일을 7KB와 4MB, 20MB 로 테스트 해본결과 20MB 는 힙 메모리 부족이라는 익센션을 날려주었습니다.
JAX-WS User Guide를 보면 용량 제한하는 어노테이션도 보이던데 테스트는 해보지 못했습니다.

이걸 해보며서 알게된 사항은 org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter 이놈은 한 컨텍스트에
한개의 웹서비스를 Export 해주는 것 같습니다. 크흑..

웹서비스는 재밌습니다?

[참고자료]
JAX-WS User Guide
  - https://jax-ws.dev.java.net/guide/Large_Attachments.html
  - https://jax-ws.dev.java.net/guide/Binary_Attachments.html
  - https://jax-ws.dev.java.net/guide/Creating_a_MTOM_Web_Service.html
java.net Forums
  - http://forums.java.net/jive/thread.jspa?threadID=25614

Posted by 자수씨
, |

지난번에 날림으로 만들었던 Spring Framework 를 이용해서 JAX-WS 를 배포하고 wsdl 을 이용하여 클라이언트를 구성하는 것을
스크린캐스트로 만들어 보았습니다.

역시 준비 없이 만든거라 말을 더듬습니다. ㅋㅋㅋㅋ 그리고 말도 안되는 이야기를 또 뱉게되네요...
스크린캐스트는 대본이 필요한 것 같습니다.

Video URL : http://www.screencast.com/t/akiF4zk8





[소스]

위 첨부파일은 lib 폴더의 데이터를 지우고 압축한 데이터입니다.

Posted by 자수씨
, |

글 보관함

최근에 받은 트랙백