web-services - 如何将拦截器添加到 wsdl2java (CXF) 生成的客户端?

标签 web-services soap cxf

我正在尝试向 wsdl2java 的入站/出站流量添加一些日志记录生成的客户端。
我有客户端生成并使用它如下:

伪代码:

MyService ws = new MyService().getMyServiceSoap12();
((BindingProvider)ws).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, webServiceAddress); // for dynamic endpoints...

有什么办法可以添加一些拦截器吗? 我在 中使用它 Spring 顺便申请!

最佳答案

您可以实现自己的 javax.xml.ws.handler.soap.SOAPHandler如果您需要以不同的方式自定义日志记录或处理 SOAP 消息,方法如下:

MyService ws = new MyService().getMyServiceSoap12();

BindingProvider wsBindingProvider = (BindingProvider) ws;

// Get a copy of the handler chain for a protocol binding instance
List<Handler> handlers =
    wsBindingProvider.getBinding().getHandlerChain();

// Add your handler(s)
handlers.add(new MySoapMessageLogger());

// We need to setHandlerChain because setHandlerChain
// returns a copy of List<Handler>
wsBindingProvider.getBinding().setHandlerChain(handlers);
MySoapMessageLogger 可能如下所示:
public class MySoapMessageLogger implements SOAPHandler<SOAPMessageContext> {

    private static final Logger logger = 
        LoggerFactory.getLogger(MySoapMessageLogger.class);

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        // Retrieve the message contents
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        context.getMessage().writeTo(stream);
        
        // You've got your XML message and can log it right away or
        // beautify it with some library before sending to log
        logger.trace((isRequest ? "Request:" : "Response:") + stream.toString());

        return true;
    }

    /* For the logging purposes the following methods can be leaved as stubs */

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

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return false;
    }

    @Override
    public void close(MessageContext context) {
    }
}

关于web-services - 如何将拦截器添加到 wsdl2java (CXF) 生成的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12071082/

相关文章:

web-services - 如何在 Mule Flow 中使用 SOAP Web 服务?

java - 创建了错误的 SOAP 请求

java - 如何从 javax.ws.rs.core.Response 响应中检索 JSON 响应?

java - 如何在 REST Web 服务中接收大型 XML 文件

java - 属性中的 JAX-WS 命名空间,而不是前缀

PHP SoapClient 删除字段?

java - LoggingInterceptors 在 CXF 中应该是静态的吗?

java - 如何优雅地释放CXF-Endpoint的端口?

c - 如何在LoadRunner中使用POST方法重写函数并使用GET方法?

rest - 了解 WSDL、SOAP、REST 等