非常感谢孙浩老师。
LogicalHandler和SOAPHandler
LogicalHandler只能获取SOAPBody的信息
SOAPHandler可以获取SOAPMessage的信息
处理顺序
SOAPHandler
创建自定义handler,实现SOAPHandler<SOAPMessageContext>,复写方法和输入语句标识:
package cn.lichen.handler;
import java.util.Set;
public class HeardHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
System.out.println("handleMessage.....");
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
System.out.println("handleFault.....");
return false;
}
@Override
public void close(MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
}
配置handler-chain.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<javaee:handler-chain>
<javaee:handler>
<javaee:handler-class>cn.lichen.handler.HeardHandler</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</javaee:handler-chains>
测试方法一:
public static void main(String[] args) {
MyServiceImplService mis = new MyServiceImplService();
IMyService ms = mis.getMyServiceImplPort();
try {
ms.login("admin", "123");
System.out.println("TestClient......");
} catch (UserException_Exception e) {
System.out.println(e.getMessage());
}
}
登入成功,没抛异常:
说明没有进入handleFault方法,和handler方法会像过滤器一样执行两次。
测试方法一:
package cn.lichen.soap;
public class TestClient {
public static void main(String[] args) {
MyServiceImplService mis = new MyServiceImplService();
IMyService ms = mis.getMyServiceImplPort();
try {
ms.login("admin", "111");
System.out.println("TestClient......");
} catch (UserException_Exception e) {
System.out.println(e.getMessage());
}
}
}
登入失败,抛异常:
说明进入handleFault方法,停止执行。