JAX-WS - Map Exceptions to faults

Did you try to annotate your exception with @WebFault? Also, do you implement getFaultInfo()?

EDIT: I realize my answer was maybe not detailed enough. As reminded in this thread (for example):

The JAX-WS 2.0 specification demands that the exception annotated with @WebFault must have two constructors and one method [getter to obtain the fault information]:

WrapperException(String message, FaultBean faultInfo)
WrapperException(String message, FaultBean faultInfo, Throwable cause)
FaultBean getFaultInfo()

The WrapperException is replaced by the name of the exception, and FaultBean is replaced by the class name that implements the fault bean. The fault bean is a Java bean that contains the information of the fault and is used by the Web service client to know the cause for the fault.

This is detailed in section 2.5 Fault of the JAX-WS specification. Does your exception conform to this? Can you post the code?


The OP is right. As per specification 2.1, section 3.7 Service Specific Exception, it is not required to use the @WebFault annotation, JAX-WS can generate the wrapper beans dynamically for exceptions that do not match the pattern described in section 2.5 (just provide a getter for the information you want to be present in the fault). For exceptions that match the pattern described in section 2.5 (i.e. exceptions that have a getFaultInfo method and @WebFault annotation), the FaultBean is used as input to JAXB when mapping the exception to XML Schema.

So the solution suggested above (matching the pattern described in section 2.5) is only a workaround. The generation of wrapper beans should just work for other exceptions. And I don't know why this fails here.


An addition to the answer above. I ended up with this as my InvalidInputException implementation:

@WebFault(faultBean = "com.mypackage.ws.exception.FaultBean")
public class InvalidInputException extends Exception {

    private static final long serialVersionUID = 1L;

    private FaultBean faultBean;

    public InvalidInputException() {
        super();
    }

    public InvalidInputException(String message, FaultBean faultBean, Throwable cause) {
        super(message, cause);
        this.faultBean = faultBean;
    }

    public InvalidInputException(String message, FaultBean faultBean) {
        super(message);
        this.faultBean = faultBean;
    }

    public FaultBean getFaultInfo() {
        return faultBean;
    }
}

And FaultBean is just a simple POJO with currently no data at all. Now, according to the JAX-WS specification (see 3.7 Service Specific Exception), it conforms to what is required of an exception annotated with @WebFault, so it will not create a wrapper bean for it, which probably is what was failing.

This is a decent workaround, but it does not explain the error in the question.