jax-ws 生成soap_在Spring中记录JAX-WS SOAP消息

jax-ws 生成soap

每当在Spring中使用JAX-WS时,您可能都希望记录传入和传出的SOAP消息-如果仅用于开发过程中的调试。 因此,第一件事就是增加日志级别,对吗? 不幸的是,这将无效。 您将要做的是利用javax.xml.ws.handler.HandlerResolver接口。 那么我们该怎么做呢?

首先,您将要创建一个实现HandlerResolver接口的类。 这是一个非常基本的类,将用于控制处理程序链。 它可能看起来像以下内容:

DefaultHandlerResolver

package it.jdev.example.ws;

import java.util.List;

import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;

public class DefaultHandlerResolver implements HandlerResolver {

    private List<Handler> handlerList;

    @Override
    public List<Handler> getHandlerChain(final PortInfo portInfo) {
        return handlerList;
    }

    public void setHandlerList(final List<Handler> handlerList) {
        this.handlerList = handlerList;
    }

}

然后,我们必须实现将进行实际日志记录的类。 此类将必须实现SOAPHandler<SOAPMessageContext>接口。 一个非常简单的实现,仅使用SLF4J记录消息:

LoggingHandler

package it.jdev.example.ws;

import java.io.ByteArrayOutputStream;
import java.lang.invoke.MethodHandles;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {

    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

    @Override
    public boolean handleMessage(final SOAPMessageContext context) {
        final SOAPMessage msg = context.getMessage();
        final boolean request = ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue();
        if (request) { // This is a request message.
            logMessage(msg);
        } else { // This is the response message
            logMessage(msg);
        }
        return true;
    }

    @Override
    public boolean handleFault(final SOAPMessageContext context) {
        logMessage(context.getMessage());
    }

    private void logMessage(final SOAPMessage msg) {
        try {
            // Write the message to the output stream
            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
            msg.writeTo(baos);
            LOGGER.info(baos.toString());
            baos.close();
        } catch (final Exception e) {
            LOGGER.error("Caught exception: " + e.getMessage(), e);
        }
    }

    @Override
    public void close(final MessageContext context) {
        // Not required for logging
    }

    @Override
    public Set<QName> getHeaders() {
        // Not required for logging
        return null;
    }

}

最后,我们必须在Spring中将所有东西连接在一起。 使用xml配置,您要做的就是添加一个新的bean定义:

配置Spring以使用SOAP消息记录器

<bean id="handlerResolver" class="it.jdev.example.ws.DefaultHandlerResolver">
		<property name="handlerList">
			<list>
				<bean class="it.jdev.example.ws.LoggingHandler" />
			</list>
		</property>
	</bean>

这就是全部。 您的应用程序现在应该记录所有JAX-WS SOAP消息。

翻译自: https://www.javacodegeeks.com/2015/05/logging-jax-ws-soap-messages-in-spring.html

jax-ws 生成soap

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值