Web Services: Exception Handling

In my previous article, I showed you how to create a simple web service and deploy it. In this article I’ll show you the basics of Exception handling using JAX-WS.

For quick reference, here’s how the Web Service looked in the last article:

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
 
// The url will now be .../HelloService
@WebService(serviceName="HelloService") 
public class SimpleWebService {
    // The method element in the XML will now be SayHello
    @WebMethod(operationName="SayHello") 
    // @WebParam will rename the input from arg0 to name
    public String sayHello(@WebParam(name="name") String name){
        return "Hello " + name + "!";
    }
}

And this is the basic client I’ll start with for testing it, for information about creating a web service client in NetBeans click here:

import simon.webservice.*;
 
public class SimpleClient {
 
    public static void main(String[] args) {
        try{
            HelloService service = new HelloService();
            SimpleWebService port = service.getSimpleWebServicePort();
 
            System.out.println(port.sayHello("Fault"));
 
        }catch(Exception e){
            System.err.println(e.getMessage());
        }
    }
}

When this is ran with the current Web Service, it’ll say “Hello Fault!”

Throwing Our Own Exception

While just throwing an Exception can be done, this is a bad idea. It carries the issue of the generated Exception class clashing with java.lang.Exception unless they are explicitly referenced.

ambigException

To get around this, we’ll make our own Exception that maps onto a SOAP fault. To be in compliance with section 2.5 of the JAX-WS specification our custom exception must:

  1. Extend Exception.
  2. Be annotated with @WebFault
  3. Use a fault bean used to store the message
  4. Implement the two constructors and the method described in the spec

Here’s the SimpleException class with the mothods required by the JAX-WS spec:

import javax.xml.ws.WebFault;
 
@WebFault(name="SimpleException")
public class SimpleException extends Exception{
    private SimpleExceptionBean faultBean;
 
    public SimpleException(String message, SimpleExceptionBean faultInfo){
        super(message);
        faultBean = faultInfo;
    }
 
    public SimpleException(String message, SimpleExceptionBean faultInfo, Throwable cause) {
        super(message, cause);
        faultBean = faultInfo;
    }
 
    public SimpleExceptionBean getFaultInfo(){
        return faultBean;
    }
}

The fault bean, which is a plain old java object (POJO):

public class SimpleExceptionBean {
    private String message;
 
    public SimpleExceptionBean() {
    }
    public SimpleExceptionBean(String message) {
        this.message = message;
    }
 
    public String getMessage() {
        return message;
    }
 
}

Now we need to modify the SimpleWebService to throw our Exception, to do this we can modify the sayHello method:

@WebMethod(operationName="SayHello") 
// @WebParam will rename the input from arg0 to name
public String sayHello(@WebParam(name="name") String name) throws SimpleException{
    if(name.equalsIgnoreCase("fault")){
        throw new SimpleException("Fault Detected", new SimpleExceptionBean());
    }
    return "Hello " + name + "!";
}

Now when we run the client, we’ll get “Fault Detected” printed out to System.err. As Faults are mapped to Exception by JAX, the catch clause in the client doesn’t need to be modified to handle the Exception mapped to the Fault.

Got any questions? Ask them below.

This post is part of our “GlassFish Articles Index” series. In these articles, we aim to explore GlassFish in different ways, from useful tutorials, to JaveOne and general.

If you’re a first-time reader, or simply want to be notified when we post new articles and updates, you can keep up to date by social media (TwitterFacebook and Google+) or the Blog RSS.

Ebook Page Link

The following two tabs change content below.
Simon Lissack is a developer at IDR Solutions, working on JavaFX, Android and the Cloud Conversion service.

Related Posts:

Simon

About Simon Lissack

Simon Lissack is a developer at IDR Solutions, working on JavaFX, Android and the Cloud Conversion service.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>