webservice06#异常#Handler
1, 异常处理
package com.yangw.soap.service;
public class UserException extends Exception {
public UserException() {
super();
}
public UserException(String message, Throwable cause) {
super(message, cause);
}
public UserException(String message) {
super(message);
}
public UserException(Throwable cause) {
super(cause);
}
}
为login()方法增加抛异常
package com.yangw.soap.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
//说明该接口是服务接口
@WebService
public interface IMyService {
......
@WebResult(name="user")
public User login(@WebParam(name="username")String username,
@WebParam(name="password")String password) throws UserException; ......
}
package com.yangw.soap.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.jws.WebService;
//说明该类是服务接口的实现类
@WebService(endpointInterface="com.yangw.soap.service.IMyService")
public class MyServiceImpl implements IMyService {
......
@Override
public User login(String username, String password) throws UserException{
for(User user:users){
if(user.getUserName().equals(username)&&user.getPassword().equals(password)){
return user;
}
}
throw new UserException("用户不存在!");
}
......
}
/**
* soap消息传递--测试异常处理
*/
@Test
public void test06() {
try {
//1,创建服务
URL url=new URL(wsdlUrl);
QName qName=new QName(ns,"MyServiceImplService");
Service service=Service.create(url, qName);
//2,创建Dispatch (创建Port的时候指定名称空间)
Dispatch<SOAPMessage> dispatch=service.createDispatch(new QName(ns,"MyServiceImplPort"),
SOAPMessage.class, Service.Mode.MESSAGE);
//3, 创建SOAPMessage
SOAPMessage msg=MessageFactory.newInstance().createMessage();
SOAPEnvelope envelope=msg.getSOAPPart().getEnvelope();
SOAPBody body=envelope.getBody();
//4, 创建QName来指定消息中传递的数据
QName eName=new QName(ns,"login", "nn"); //前缀必须指定,名字可以任意 <nn:add xmlns="XXX" />
SOAPBodyElement bEle=body.addBodyElement(eName); /* * 因为username=yang password=wei,这个用户是不存在,因此会抛UserException, * 这个异常会被SOAPFaultException捕获,Webservice会对他处理,因为服务器不会抛异常出来,而是在我们客户端打印我们的异常信息 “用户不存在!” * webservice会将我们的异常转换为 * <message name="UserException"><part name="fault" element="tns:UserException"/></message> */
bEle.addChildElement("username").setValue("yang");
bEle.addChildElement("password").setValue("wei");
msg.writeTo(System.out); //输出消息到控制台
System.out.println("\n invoke ...");
//5, 通过Dispatch传递消息
SOAPMessage resMsg= dispatch.invoke(msg);
resMsg.writeTo(System.out);
System.out.println();
}catch (SOAPFaultException e) {
System.out.println(e.getMessage());
} catch (SOAPException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
控制台打印的信息 如下:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <nn:login xmlns:nn="http://service.soap.yangw.com/"> <username>yang</username> <password>wei</password> </nn:login> </SOAP-ENV:Body> </SOAP-ENV:Envelope> invoke ... 用户不存在!
2,Handler处理SOAP消息
LogicalHandler: 只能获取SOAPBody的信息,下面简称 LH;
SOAPHandler: 可以 获取SOAPMessage的信息,下面简称 SH
客户端,服务器端都可以设置若干个 LH SH !

例子:客户端设置了 SH1 LH1 SH2 LH2 LH3,服务端设置了SH2 SH3 LH2 LH3 LH1
那么最终通过的Handler形式是: LH1 LH2 LH3 SH1 SH2 SH2 SH3 LH2 LH3 LH1
需要使用wsimport命令将代码导入到新的工程中!!!
创建SOAPHandler的顺序:
1> 创建一个类实现SOAPHandler接口
2>在handlerMessage()方法中编写相应的处理代码
package com.yangw.soap.service.handler;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
/**
* 这里写了一个HeaderHandler类,实现了接口SOAPHandler,需要设置泛型为SOAPMessageContext
* @author yangw
*/
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
System.out.println("handler message");
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
System.out.println("fault");
return false;
}
@Override
public void close(MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
}
3>配置handler,配置文件名字可以随便起,放到类路径下即可
<?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>com.yangw.soap.service.handler.HeaderHandler</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</javaee:handler-chains>
handler-chain.xml 文件放置在类路径下即可.
3>在服务上开启过滤器链 @HandlerChain(file="handler-chain.xml")
package com.yangw.soap.service;
import javax.jws.HandlerChain;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceClient;
@WebServiceClient(name = "MyServiceImplService", targetNamespace = "http://service.soap.yangw.com/", wsdlLocation = "http://localhost:8899/ns?wsdl")
@HandlerChain(file="handler-chain.xml")
public class MyServiceImplService extends Service {
......
}
4>测试类
package com.yangw.soap.service;
public class Test {
public static void main(String[] args) {
MyServiceImplService mis=new MyServiceImplService();
IMyService service=mis.getMyServiceImplPort();
try {
/**
* 因为后端没有yangw wei 这个用户,因此控制台打印如下:
* handler message
* fault
* 用户不存在!
*/
service.login("yangw", "123456");
System.out.println("over");
/**
* 存在用户 yangw 123456,打印如下:
* handler message
* handler message
* over
*/
} catch (UserException_Exception e) {
System.out.println(e.getMessage());
}
}
}
webservice06#异常#Handler的更多相关文章
- 获取内核当前执行模块和当前发生异常地址和线程异常Handler调用步骤
循环每个内核模块 统计模块大小 判断触发异常的地址属于那个模块.来确定模块 获取发生异常地址 nt!_EXCEPTION_RECORD +0x000 ExceptionCode : -21391605 ...
- springboot接口返回封装与异常控制
首先,返回有两个状态,status和code status标识response的状态,有2个值:0成功,-1服务错误. code跟业务有关,可以有各种数值,99999服务未知异常,10000参数异常, ...
- 异常 Exception 知识点总结 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Atitit.异常机制的设计原理
Atitit.异常机制的设计原理 缺陷 关键是只要知晓有一个异常表的存在,try 的范围就是体现在异常表行记录的起点和终点.JVM 在 try 住的代码区间内如有异常抛出的话,就会在当前栈桢的异常表中 ...
- 初识exception
一.exception的分类 根据此exception(异常)是否可以打断正在执行的指令,可以将exception分为 asynchronous exception 和 synchronous exc ...
- 进入OS前的两步之PendSV(任务切换)
先了解下如何使用PendSV异常.(为何要使用PendSV而不是其他的异常,请参考<cortex-M3权威指南>) 1,如何设定PendSV优先级? NVIC_SYSPRI14 EQU 0 ...
- android网络图片查看器
package com.itheima.netimageviewer; import java.io.BufferedReader; import java.io.File; import java. ...
- Cortex-M3寄存器等基础知识
1.寄存器 CM3拥有R0~R15通用寄存器和一些特殊功能寄存器 R0~R12这些通用寄存器,复位初始值都是不可预料的 2.CM3有R0到R15的通用寄存器组 注:绝大部分的16位thumb只能访问R ...
- dubbo源码—Service Reply
dubbo通过netty将请求发送到provider的时候,provider之前已经启动好的NettyServer监听指定端口的时候会收到来自consumer的请求,将通过网络发送来的二进制编码成Re ...
随机推荐
- How to make sure your machine is always online without sleep
1. Create a "NeverOff" power plan: Control Panle->System and Security->Power Options ...
- git 生成公钥、私钥方法与clone使用方法
我的配置流程 Git配置 Git安装完之后,需做git配置.打开git bash,分别执行以下两句命令 git config --global user.name "用户名" gi ...
- .NET平台微服务项目汇集
最近博客园出现了一篇文章<微服务时代之2017年五军之战:Net PHP谁先死>,掀起了一波撕逼,作者只是从一个使用者的角度来指点江山,这个姿势是不对的..NET Core就是专门针对模块 ...
- flannel 的连通与隔离 - 每天5分钟玩转 Docker 容器技术(61)
上一节我们在 flannel 网络中部署了容器,本节讨论 flannel 的连通和隔离特性. flannel 网络连通性 测试 bbox1 和 bbxo2 的连通性: bbox1 能够 ping 到位 ...
- jQuery绑定事物处理器
绑定与移除1..bind() 绑定事件可以有2个或者3个参数:第一个参数为事件类型 第二个参数为处理函数 第三个为布尔类型 on()事件代替2..delegate() 事件委托,三个参数,第一个为选择 ...
- 关于RESTful接口api的设计
你封装api的话,你对同城,你相当于客户端,你只顺应他的签权机制:别人调你的话,你有一套签权机制,别人就是客户端,只顺应你的签权:这样就统一了,容易扩展,以后你接了几套签权,别人对你还是一套,你们就是 ...
- 模仿Spring实现注解注入
写这个极其蛋疼,我一直在想我们用SSM写项目时,写Service和Controller的时候,会给Service和Controller私有属性,比如Service需要dao,Controller需要S ...
- 自己动手写java 字节流输入输出流
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流. "流是磁盘或其它外围设备中存储的数据的源点或终点." ...
- HTML5新增属性data-*和js/jquery之间的交互
HTML5新增属性data- data-自定义属性,这种方式的自定义属性解决属性混乱无状态管理的现状 书写实例 <div data-role="page" data-last ...
- C#多线程的用法7-线程间的协作ManualResetEvent
ManualResetEvent:手动重置事件,它用于线程间同步时用法非常简单也易于理解. private static void MultiThreadSynergicWithManualReset ...