SOAP的异常处理

(1)首先,新建异常类UserException,继承自Exception,基于父类生成构造函数(Source-->Generate Constructors from Superclass)

UserException.java

public class UserException extends Exception {

	public UserException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public UserException(String message, Throwable cause,
			boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}

	public UserException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public UserException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public UserException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}
}


(2)定义WebService服务端接口中的方法throws Exception

IMyService.java

@WebResult(name="user")
public User login(@WebParam(name="userName")String userName,
		  @WebParam(name="password")String password) throws UserException;


实现类MyServiceImpl.java中该方法的具体实现:

@Override
@WebResult(name = "user")
public User login(@WebParam(name = "userName") String userName,
		@WebParam(name = "password") String password) throws UserException {
	for(User user : users) {
		if (userName.equals(user.getUserName()) && password.equals(user.getPassword())) {
			return user;
		}
	}
	throw new UserException("用户不存在");
}


发布服务,生成的wsdl中会定义异常

(3)使用SOAP方式测试

/**
 * soap的异常处理
 */
@Test
public void test05() {
	try {
		//1.创建服务(Service)
		URL url = new URL(wsdlUrl);
		QName sName = new QName(ns, "MyServiceImplService");
		Service service = Service.create(url, sName);
		
		//2.创建Dispatch
		Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns, "MyServiceImplPort"),
				SOAPMessage.class, Service.Mode.MESSAGE);
		
		//3.创建SOAPMessage
		SOAPMessage message = MessageFactory.newInstance().createMessage();
		SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
		SOAPBody body = envelope.getBody();
		
		//4.创建QName来指定消息中传递的数据
		//这里传输了一对不存在的用户名和密码,以便测试
		QName eName = new QName(ns, "login", "nn");	//<nn:add xmlns="xx" />
		SOAPBodyElement ele = body.addBodyElement(eName);
		ele.addChildElement("userName").setValue("ss");
		ele.addChildElement("password").setValue("dd");
		message.writeTo(System.out);
		System.out.println("\n invoking......");
		/*
		 * 打印结果为:
		 * <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.org/">
		 * 			<userName>ss</userName>
		 * 			<password>dd</password>
		 * 		</nn:login>
		 * 	</SOAP-ENV:Body>
		 * </SOAP-ENV:Envelope>
		 *  invoking......
		 */
		
		//5.通过Dispatch传递信息,会返回响应消息
		SOAPMessage response = dispatch.invoke(message);	//catch异常
		response.writeTo(System.out);
		System.out.println("a");
		/*
		 * 由于dispatch.invoke(message)的时候catch到异常,后两行语句被跳过,未执行。
		 */
	} catch (SOAPFaultException e) {
		System.out.println(e.getMessage());
		/*
		 * 截获UserException,打印结果为:用户不存在
		 * 此UserException实际为客户端调用服务端的方法,服务端抛出的UserException,然后返回给客户端
		 */
	} catch (MalformedURLException e) {
		e.printStackTrace();
	} catch (SOAPException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}


(4)使用JAX-WS方式测试

public class Test {

	public static void main(String[] args) throws Exception {
		URL url = new URL("http://localhost:8989/ms?wsdl");
		QName qName = new QName("http://service.soap.org/", "MyServiceImplService");
		
		MyServiceImplService mis = new MyServiceImplService(url, qName);
		IMyService ms = mis.getMyServiceImplPort();
		
		try {
			ms.login("admin", "111111");
		} catch (UserException_Exception e) {
			System.out.println(e.getMessage());
		}
	}
}


WebService的异常处理:客户端向服务端发消息(调用服务端的方法),出现异常,截获。首先根据wsdl来判断一下,该方法有没有输出异常。如果是未定义的错误,则在服务器端往上抛,服务器端打印异常;如果是已定义的错误,则服务器端不打印错误,返回给客户端。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值