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 ...
随机推荐
- ubuntu下发布asp.net core并用nginx代理之旅
asp.net core 1.0.1发布已有些日子了,怀着好奇的心情体验了把ubuntu下的asp.net core 系统运行环境:ubuntu 16.0.4 for developer 首先搭建.n ...
- SQL语句:Group By总结
1. Group By 语句简介: Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)".它的作用是通过一定的规则将一个数据集划分成若干个 ...
- Google 以图搜图 - 相似图片搜索原理 - Java实现 (转)
前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动要将这些原理实现出来了. Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相 ...
- 【win10】大水牛主机插入耳机没有声音
主机:大水牛,技嘉主板 操作系统:win10 问题:主机前面插入耳机,没有声音,扬声器图标出错 解决 一..插入耳机 二..Realtek高清晰音频管理器 1.打开音频管理器,点击右下角的设置 2.点 ...
- 缓存一致性和跨服务器查询的数据异构解决方案canal
当你的项目数据量上去了之后,通常会遇到两种情况,第一种情况应是最大可能的使用cache来对抗上层的高并发,第二种情况同样也是需要使用分库 分表对抗上层的高并发...逼逼逼起来容易,做起来并不那么乐观, ...
- Shuffle 的 5步
Shuffle的本意是洗牌.混乱的意思,类似于java中的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序.MapReduce中的Shuffle过程.所谓 ...
- hashlib使用时出现: Unicode-objects must be encoded before hashing
# hashlib.md5(data)函数中,data参数的类型应该是bytes# hash前必须把数据转换成bytes类型>>> from hashlib import md5 F ...
- 聊聊并发-Java中的Copy-On-Write容器
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp78 聊聊并发-Java中的Copy-On-Write容器 Cop ...
- NPOI导Excel样式设置(转)
一.创建一个Excel //创建一个工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); //创建一个页 ISheet sheet = workbook.Cr ...
- makefile中":=","=","?=","+=" 之间的区别
区别: := 有关位置的等于,值取决于当时位置的值 = 无关位置的等于,值永远等于最后的值 ?= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值 '=':无关位置的等于 比如: x = ...