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的更多相关文章

  1. 获取内核当前执行模块和当前发生异常地址和线程异常Handler调用步骤

    循环每个内核模块 统计模块大小 判断触发异常的地址属于那个模块.来确定模块 获取发生异常地址 nt!_EXCEPTION_RECORD +0x000 ExceptionCode : -21391605 ...

  2. springboot接口返回封装与异常控制

    首先,返回有两个状态,status和code status标识response的状态,有2个值:0成功,-1服务错误. code跟业务有关,可以有各种数值,99999服务未知异常,10000参数异常, ...

  3. 异常 Exception 知识点总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. Atitit.异常机制的设计原理

    Atitit.异常机制的设计原理 缺陷 关键是只要知晓有一个异常表的存在,try 的范围就是体现在异常表行记录的起点和终点.JVM 在 try 住的代码区间内如有异常抛出的话,就会在当前栈桢的异常表中 ...

  5. 初识exception

    一.exception的分类 根据此exception(异常)是否可以打断正在执行的指令,可以将exception分为 asynchronous exception 和 synchronous exc ...

  6. 进入OS前的两步之PendSV(任务切换)

    先了解下如何使用PendSV异常.(为何要使用PendSV而不是其他的异常,请参考<cortex-M3权威指南>) 1,如何设定PendSV优先级? NVIC_SYSPRI14 EQU 0 ...

  7. android网络图片查看器

    package com.itheima.netimageviewer; import java.io.BufferedReader; import java.io.File; import java. ...

  8. Cortex-M3寄存器等基础知识

    1.寄存器 CM3拥有R0~R15通用寄存器和一些特殊功能寄存器 R0~R12这些通用寄存器,复位初始值都是不可预料的 2.CM3有R0到R15的通用寄存器组 注:绝大部分的16位thumb只能访问R ...

  9. dubbo源码—Service Reply

    dubbo通过netty将请求发送到provider的时候,provider之前已经启动好的NettyServer监听指定端口的时候会收到来自consumer的请求,将通过网络发送来的二进制编码成Re ...

随机推荐

  1. shell学习笔记(一)

    1.第一行必须以#!/bin/bash #!表示脚本使用后面的解释器解释执行 2.echo 打印输出 例如   echo "hello world" > aa.txt 3.接 ...

  2. HDU 6170----Two strings(DP)

    题目链接 Problem Description Giving two strings and you should judge if they are matched.The first strin ...

  3. 【转载】由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理

    转自:http://zhangbo-peipei-163-com.iteye.com/blog/2033832?utm_source=tuicool&utm_medium=referral 我 ...

  4. mysql服务器主从数据库同步配置(转)

    <a href=""></a> <p>首先需要在同一个局域网内的两台机器(当然也可以用一台机器虚拟两台机器出来),都安装上mysql服务.< ...

  5. Python第一天---第一个Python程序

    1.我的环境是windows下,需要安装notepad++,安装Python2,配置环境变量(百度下可以见) 2.打开cmd窗口-----输入I:  [输入要在哪个磁盘存储python代码(我的在I: ...

  6. CNAME关联githubPage域名及中文域名,创建个人网站

    对于前端开发来说,部署一个自己的个人网站部署服务器等比较麻烦,如果只是做静态页面的展示GitHubPage完全够用,而且有300M免费的空间,完全满足需求. 首先你要有GitHubPage项目,具体怎 ...

  7. 如何安装Windows 7旗舰版

    如何安装Windows 7旗舰版.. ----------------- Windows 7旗舰版安装的初始画面 ------------------------- 选择好语言后,点击“下一步”按钮, ...

  8. [js高手之路]jquery插件开发实战-选项卡详解

    在jquery中,插件开发常见的有: 一种是为$函数本身扩展一个方法,这种是静态扩展(也叫类扩展),这种插件一般是工具方法, 还有一种是扩展在原型对象$.fn上面的,开发出来的插件是用在dom元素上面 ...

  9. 关于样式选择器:hover出现忽闪现象

    有时候在做项目的时候会想给一个元素添加一个遮罩效果,然后鼠标划过去的时候,遮罩消失,一般最简单的方法就是使用样式选择器:hover,但是经历过才知道恶心,有种灯泡快要坏的感觉,闪瞎自己的眼睛,于是诞生 ...

  10. java代码块的理解

    最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合 ...