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