JAX-WS RI:实现Method Interceptor的最佳方法

时间:2011-06-14 11:57:15

标签: java web-services soap jax-ws aop

我想为我的webservice调用提供自己的方法拦截器。基本上,这个方法拦截器应该在调用真实方法之前调用 ...参见下面的代码片段:

public class MyMethodInterceptor {
  public Object invoke(Object t, Method m, Object[] args) throws Throwable {
    // do some magic, such as tracing, authorise, etc...
    return m.invoke(t, args);
  }     
}

// ....    

public class MyWebServiceImpl implements MyWebServiceInterface {
  public String greet(final String name) {
    return "Hi there, " + name;
  }
}

这个想法是每次调用webservice时,都会通过我的拦截器调度它。我已经看过我自己的InstanceResolver,但它已经失去控制。我知道如何在CXF和JAX-RS(Jersey)+ Guice中做到这一点。

JAX-WS提供handler-chains,但是这些处理程序过早地调用 (即,在方法调用之前),所以此时我没有所需的信息。

使用JAX-WS的Referene实现执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

在jax-ws处理程序中,您就在真实事物之前,您可以访问整个SOAP消息的内容,您还需要哪些内容?

编辑:
在处理程序中使用的一些示例:

public String getMessage(SOAPMessageContext smc) {
    SOAPMessage message = smc.getMessage();
    ByteArrayOutputStream soapEnvelope = new ByteArrayOutputStream();
    message.writeTo(soapEnvelope);
    soapEnvelope.close();
    return new String(soapEnvelope.toByteArray());
}

public String getMethod(SOAPMessageContext smc) {
    SOAPMessage message = smc.getMessage();
    SOAPBody body = message.getSOAPBody();
    return body.getFirstChild().getLocalName();
}