(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来判断一下,该方法有没有输出异常。如果是未定义的错误,则在服务器端往上抛,服务器端打印异常;如果是已定义的错误,则服务器端不打印错误,返回给客户端。