Java 处理程序未从web服务记录任何内容,甚至未抛出错误(在使用metro的tomcat上)
我阅读了很多关于记录web服务请求/响应的教程,发现它们都在做相同的事情,但我无法记录请求,尽管事情似乎是正确的,但它甚至没有抛出错误。这里我给出了我的示例代码,如果有人能告诉我哪里出了错,哪里出了错,那就太好了Java 处理程序未从web服务记录任何内容,甚至未抛出错误(在使用metro的tomcat上),java,web-services,tomcat,handler,java-metro-framework,Java,Web Services,Tomcat,Handler,Java Metro Framework,我阅读了很多关于记录web服务请求/响应的教程,发现它们都在做相同的事情,但我无法记录请求,尽管事情似乎是正确的,但它甚至没有抛出错误。这里我给出了我的示例代码,如果有人能告诉我哪里出了错,哪里出了错,那就太好了 My web service @WebService(endpointInterface = "com.sample.ws.SampleWS", serviceName = "SampleWS") @HandlerChain(file="/com/sample/ws/handler
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);
}
}
}
我的web服务
@WebService(endpointInterface=“com.sample.ws.SampleWS”,serviceName=“SampleWS”)
@HandlerChain(文件=“/com/sample/ws/handler.xml”)
公共类SampleWSImpl实现SampleWS{
公共SampleWSImpl(){}
公共字符串hello(字符串s){
返回“Hello”+s;
}
}
我的handler.xml。
com.sample.LoggingHandler
我的日志处理程序类。
公共类LoggingHandler实现SOAPHandler{
@凌驾
公共集getHeaders(){
返回null;
}
@凌驾
公共无效关闭(MessageContext上下文){
}
@凌驾
公共布尔handleFault(SOAPMessageContext上下文){
logToSystemOut(上下文);
返回true;
}
@凌驾
公共布尔handleMessage(SOAPMessageContext上下文){
logToSystemOut(上下文);
返回true;
}
专用void logToSystemOut(SOAPMessageContext smc){
Boolean outboundProperty=(Boolean)smc.get(MessageContext.MESSAGE\u OUTBOUND\u属性);
试一试{
如果(!outboundProperty.booleanValue()){
SOAPMessage=smc.getMessage();
System.out.println(“传入消息:”);
ByteArrayOutputStream=新建ByteArrayOutputStream();
message.writeTo(流);
System.out.println(stream.toString());
System.out.println(“======================================================================”);
}
}
捕获(例外e){
System.out.println(“处理程序中的异常:+e”);
}
}
}
您可以实现MessageHandler,它应该可以工作:
公共类MyLoggingHandler实现MessageHandler{
私有静态最终记录器Logger=LoggerFactory.getLogger(MyLoggingHandler.class)
公共布尔handleMessage(MessageHandlerContext mhc){
Message m=mhc.getMessage().copy();
ByteArrayOutputStream=新建ByteArrayOutputStream();
XMLStreamWriter writer=XMLStreamWriterFactory.create(流);
试一试{
m、 书面(作者);
如果(stream.size()>0){
LOGGER.debug(“>>Message com.sun.metro.samples.tubeinterceptor.tube->INFO javax.enterprise.resource.webservices.assembler->FINER javax.enterprise.resource.webservices->INFO配置此日志参数并检查。
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;
}