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 ...
随机推荐
- 用Redis实现优先级队列
在最近在面试过程中,张先森遇到一个面试官这么问,如果一个并发很大的消息应用,想要根据请求的优先级来处理,该怎么做.我当时只是笼统地回答用redis,面试官点了点头,这个问题就此通过. 那么用redis ...
- unity slua整合帅气的lua-pb解析protobuf
了解到lua的一个protobuf库,接口帅气,比之前用过的一些lua protobuf库要好很多,深得我心.而且能保持更新,比其他库几年没更新要放心. lua-pb动态解析protobuf协议,无需 ...
- 【Shell Basic】source . 与 bash sh 的区别
一.在命令行窗口执行shell脚本时,source .所执行的脚本中,变量的作用域在当前shell窗口期,而bash.sh在shell脚本执行完了就失效了. dream361@master:~$ ca ...
- Bootstrap-table事件使用
HTML <div class="alert alert-danger" id="eventInfo"></div> <table ...
- 设置Linux环境变量的方法与区别(Ubuntu)
设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别. 通过文件设置 Linux 环境变量 首先是设置全局环境变量, ...
- ROS学习记录(二)————使用smartcar进行仿真(用.xacro文件来运行rviz)
我发现一个学习ROS系统的好网站: 创客智造http://www.ncnynl.com/ 这里面关于ROS的各个方面都有很详细的介绍. 这周,不,上周我对整个ROS是绝望的,我用一个一个下午的时间在敲 ...
- 交换基本数据类型的方法swap,并影响到主方法
不知道朋友在哪里看到的问题,qq来问我,题目是:在不修改主方法的前提下使用一个方法交换两个int的值,方法如下: public static void main(String[] args) { In ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- EF增删改查+使用Expression进行动态排序分页
注:以下部分来自<ASP.NET MVC 企业级实战>一书的摘抄和改写以及部分个人学习心得. EF简单增删改查 增加 public static int Add() { using (No ...
- java读取txt文件内容
package read; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public ...