2012-02-22 1 views
1

soapMessage와 함께 비누 핸들러에 필드를 추가하는 방법은 무엇입니까?

public boolean handleMessage(SOAPMessageContext smc) { 
    logToSystemOut(smc); 
    return true; 
} 


private void logToSystemOut(SOAPMessageContext smc) { 
    Boolean outboundProperty = (Boolean) 
    smc.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

    if (outboundProperty.booleanValue()) { 
     out.println("\nOutbound message:"); 
    } else { 
     out.println("\nInbound message:"); 
    } 

    SOAPMessage message = smc.getMessage(); 
    try { 
     message.writeTo(out); 
     out.println(""); 
     } catch (Exception e) { 
     out.println("Exception in handler: " + e); 
    } 
} 

합니다 (XML에없는) 몇 가지 여분의 값과 함께 DB에이 XML을 추가 할 수있는 새로운 requirenment있어 다음과 같이 내가 SoapHandler를 사용하여 웹 서비스 클라이언트에 대한 RequestXML을 기록하고있다. 위의 비누 핸들러에 handleMessage 메소드의 몇 가지 추가 필드를 전달할 수있는 방법이 있습니까?

다른 인터페이스가 소유하고있는 xml/WSDL을 변경하거나 SOAP 메시지 헤더에 추가하는 것은 옵션이 아닙니다. 다른 해결책?

감사합니다.

답변

0

서비스 클래스를 "BindingProvider"유형의 클래스로 캐스팅 할 수 있습니다. 이 폼에서 나중에 SOAPHandler에서 액세스 할 수있는 객체를 할당 할 수 있습니다. 또 다른 유용한 용도는이 방법으로 endPoint URL을 변경할 수도 있다는 것입니다.

서비스를 호출하기 전에 당신이 할 :

MySoapServicePortType service = new MySoapService().getMySoapServicePort(); 
    BindingProvider bp = (BindingProvider)service; 
    MyTransferObject t = new MyTransferObject(); 
    bp.getRequestContext().put("myTransferObject", t); 
    TypeResponse response = service.doRequest(); 
    SOAPMessage message = t.getRequestMessage(message); 

로깅 기능에서 당신이 할 :

private void logToSystemOut(SOAPMessageContext smc) { 
    ... 
    MyTransferObject t = (MyTransferObject) messageContext.get("myTransferObject"); 
    if (outboundProperty.booleanValue()) 
     t.setRequestMessage(message); 
    else 
     t.setResponseMessage(message); 
    ... 
} 
관련 문제