axis 4

SAAJ 클라이언트에 핸들러 등록하기.

SAAJ로 SOAPMessage를 생성하여 endPoint에 전송하는 코드가 있다. 이 코드에서 핸들러를 사용하려고 한다. 그러나 핸들러는 DII 타입의 클라이언트에서 등록하는 방법만 알고 있다. 여기저기 쑤셔본 결과, 딱히 등록한 위치는 못찾겠다. Handle 인터페이스의 모양새가 init 후 handleRequest, handleResponse 이므로 각각의 메서드를 그냥 호출하기로 했다. 특별한 이상없이 잘 작동하였으나, handleRequest의 파라미터가 MessageContext 이기 때문에 이 클래스의 인스턴스가 필요하다. SAAJ, JAXRPC 인터페이스로는 생성이 불가하고, AXIS에서 구현한 클래스(org.apache.axis.MessageContext)로 인스턴스를 생성할 수 있었다...

카테고리 없음 2007.01.04

AXIS에서 닫기태그(end-tag)가 사라질때

분명히 핸들러에서는 정상적인 메시지를 보냈음을 확인하고 return 했는데 SOAPMonitor를 보면 수십바이트의 데이터가 누락되어 닫기태그가 없다는 오류가 발생한다. 한참을 방황하다가 숫자놀이를 시작했는데, 누락된 데이터의 길이가 xml헤더의 길이와 일치하는 것이 아닌가? 그리하여 SOAPPart 객체에 setContent를 사용하는 방법에 문제가 있는 것이 아닌가를 확인하였고 원래 만들어두었던 DOMSource(Document)를 사용하던 방법을 사용하지 않고 StreamSource( InputStream )을 사용하여 Source를 만들었다. 그 결과 메지지가 누락되는 일은 발생하지 않았는데, 예상치 못하게 서버에서 정확한 응답을 해 주었다. 서버에는 변경된 소스를 적용하지 않았는데도 말이다. 일..

JAX-RPC 핸들러에서 OperationName 을 얻을 수 있는가?

표준 인터페이스를 통해서 얻는 방법이 있을까? 일단은 찾지 못했다. AXIS는 MessageContext 에서 getOperation 메서드를 제공하고, 웹로직도 비슷하게 제공한다. 그러나 결국 표준인터페이스라고 말하기는 힘들다. AXIS의 MessageContext 말고 표준 MessageContext 객체의 property를 보니까 wsdl.service 라는 이름으로 Service 객체가 삽입되어 있었다. 이 객체를 꺼내보니까 해당 서비스의 모든 OperationName을 얻어 낼 수 있었다. 그런데.. 내가 호출한 Operation이 어떤걸까? 이것만 알아내면 되는데... 불과 몇분 안지났다.. call_object 객체도 property에 들어있다. 말 그대로 Call의 인스턴스니까 맘대로 얻을..

AXIS에서 클라이언트용 JAXRPC 핸들러 만들때 유의 점.

기존에 웹로직에서 잘~ 작동하던 핸들러가 AXIS에서는 작동하지 않았다. 클라이언트건 서버건 어떠한 핸들러도 돌아가지 않았다. 신나는 구글링 끝에 개인 블로그에서 특정 메서드를 호출하면 AXIS가 핸들러를 호출하지 않는다는 내용의 글을 발견했다. 그래서 변경한 것이. ServiceFactory.createService() 메서드를 호출하던 것을 ServiceFactory.createService( URL, QName )으로, Service.createCall() 을 호출 하는 것을 Service.cretaeCall( QName )로 변경했고. Call.setPortTypeName( QName), Call.setTargetEndPointAddress( String ) 메서드를 주석처리 했다. 이렇게 하니까..