我正在尝试通过客户端访问SOAP请求和响应,以便我可以计算每次调用的执行时间。我已经实现了SOAPHandler
来实现这一点,但是没有调用handleMessage
方法(断点没有被命中或没有记录日志)。我正在使用wsimport创建客户端类/存根,并将绑定文件作为参数传递给wsimport命令。
这是我到目前为止所做的:
我的绑定文件 - handler-chain.xml
<jaxws:bindings
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb">
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>LoggingSOAPHandler</handler-name>
<handler-class>com.handler.LoggingSOAPHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
</jaxws:bindings>
wsimport命令:
<property name="package" value="com.ws"/>
<property name="src" value="docroot/WEB-INF/src"/>
<property name="classes" value="docroot/WEB-INF/classes"/>
<property name="bindingfile" value="docroot/WEB-INF/src/com/handler/handler-chain.xml"/>
<target name="wsimport">
<exec executable="${jdk.home}/bin/wsimport">
<arg line="-keep -s ${src} -p ${package} -d ${classes} -b ${bindingfile} ${wsdl}"/>
</exec>
</target>
当我在wsimport命令上面运行时,会创建所有存根,并将@HandlerChain
注释添加到存根服务类中,如下所示:
@WebServiceClient(name = "TestService", targetNamespace = "http://webservice.com/", wsdlLocation = "http://test:8290/TEST/services/test?wsdl")
@HandlerChain(file = "TestService_Service_handler.xml")
public class TestService_Service
extends Service
{
...
}
这是生成的TestService_Service_handler.xml:
<?xml version="1.0" encoding="UTF-8"?><handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>LoggingSOAPHandler</handler-name>
<handler-class>com.handler.LoggingSOAPHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
这是我的SOAPHandler
:
public class LoggingSOAPHandler implements SOAPHandler<SOAPMessageContext> {
private static Logger _logger = LoggerFactory.getLogger(LoggingSOAPHandler.class);
@Override
public boolean handleMessage(SOAPMessageContext messageContext) {
Boolean outboundProperty = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
_logger.info("\nOutbound message:");
} else {
_logger.info("\nInbound message:");
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
_logger.info("Client : handleFault()......");
return false;
}
@Override
public void close(MessageContext context) {
_logger.info("Client : close()......");
}
@Override
public Set<QName> getHeaders() {
_logger.info("Client : getHeaders()......");
return null;
}
}
调用webservice时,根本不会调用handleMessage方法。
有什么想法?
我正在使用JAX-WS RI 2.2.4-b01来生成存根。
答案 0 :(得分:2)
找到了这个问题的解决方案,但要回答这个问题,我必须提供更多关于这个项目的背景信息。
该项目使用Spring MVC和JaxWsPortProxyFactoryBean来实现JAX WS服务接口。
由于目标是让所有SOAP调用都使用'LoggingSOAPHandler',因此必须通过HandlerResolver将'LoggingSOAPHandler'注入JaxWsPortProxyFactoryBean。我创建了一个HandlerResolver实现....
CustomHandlerResolver:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ http://client.qa.example.com/?param=$1 [R=301,QSA,L]
我将hanlderResolver bean和注入添加到服务xml配置文件中:
cflow
因为处理程序解析器被注入到JaxWsPortProxyFactoryBean中,所以在运行时会注入CustomHandlerResolver类中指定的处理程序。