2012-04-11 3 views
0

웹 서비스 요청/응답을 로깅하기위한 튜토리얼이 많이 읽 혔고 같은 일을하고 있지만 모두 할 수 없다는 것을 알았습니다. 요청을 기록하지만 오류가 발생하지 않는 것은 올바른 것으로 보입니다. 여기 샘플 코드를 주면 실수가 어디서 무엇인지 알 수 있다면 좋을 것입니다.웹 서비스에서 아무 것도 로깅하지 않는 처리기 (메트로를 사용하는 바람둥이)

My web service 

@WebService(endpointInterface = "com.sample.ws.SampleWS", serviceName = "SampleWS") 
@HandlerChain(file="/com/sample/ws/handler.xml") 
public class SampleWSImpl implements SampleWS { 
public SampleWSImpl() {} 
public String hello(String s) { 
return "Hello "+s; 
} 
} 



my handler.xml. 

<?xml version="1.0" encoding="UTF-8"?> 
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> 
<handler-chain> 
<handler> 
<handler-class>com.sample.LoggingHandler</handler-class> 
</handler> 
</handler-chain> 
</handler-chains> 



my log handler class . 

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> { 

@Override 
public Set<QName> getHeaders() { 
return null; 
} 

@Override 
public void close(MessageContext context) { 
} 

@Override 
public boolean handleFault(SOAPMessageContext context) { 
    logToSystemOut(context); 
    return true; 


    } 

    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
    logToSystemOut(context); 
     return true; 
    } 

private void logToSystemOut(SOAPMessageContext smc) { 

    Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

    try { 
    if (!outboundProperty.booleanValue()) { 

    SOAPMessage message = smc.getMessage(); 

    System.out.println("Incoming message:"); 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    message.writeTo(stream); 

    System.out.println(stream.toString()); 
    System.out.println("=====================================");     
    } 
    } 
    catch (Exception e) { 
    System.out.println("Exception in handler: " + e); 
    } 
    } 
} 
+0

com.sun.metro.samples.tubeinterceptor.tube -> 정보 javax.enterprise.resource.webservices.assembler -> FINER javax.enterprise.resource.webservices -> 정보 이 로깅 매개 변수를 구성하고 확인하십시오. – Phani

답변

1

당신은에 messageHandler를 구현할 수있다, 그 작동합니다 :

공용 클래스 MyLoggingHandler는에 messageHandler { 개인 정적 최종 로거 로거 = LoggerFactory.getLogger (MyLoggingHandler.class)를 구현;

public boolean handleMessage(MessageHandlerContext mhc) { 
    Message m = mhc.getMessage().copy(); 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    XMLStreamWriter writer = XMLStreamWriterFactory.create(stream); 
    try { 
     m.writeTo(writer); 
     if(stream.size() > 0) { 
      LOGGER.debug(">> Message << \n{}", new String(stream.toByteArray())); 
     } 
    } catch (XMLStreamException e) { 
     LOGGER.error("Could not log the incoming message, something wrong with the xml?", e); 
     return false; 
    } 
    return true; 
} 

public boolean handleFault(MessageHandlerContext mhc) { 

    return true; 
} 

public void close(MessageContext messageContext) { 
} 

public Set getHeaders() { 
    return null; 
} 

}