Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAX-WS - Map Exceptions to faults

I am using JAX WS to expose a WebService. Some of the operations of this service can generate exceptions. Not internal server exceptions, but rather exceptions that are dependent on the input arguments of the operation invocation.

If I specify that my operation throws a custom Exception, like so:

@WebService @SOAPBinding(style = Style.RPC, use = Use.LITERAL) public class MyServiceEndpointImpl implements MyServiceEndpoint {      @WebMethod     public void throwsException throws InvalidInputException; } 

I end up with the following stacktrace when running the application:

 com.sun.xml.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class com.mypackage.ws.services.jaxws.InvalidInputExceptionBean is not found. Have you run APT to generate them?     at com.sun.xml.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:285)     at com.sun.xml.ws.model.RuntimeModeler.processExceptions(RuntimeModeler.java:1006)     at com.sun.xml.ws.model.RuntimeModeler.processRpcMethod(RuntimeModeler.java:969)     at com.sun.xml.ws.model.RuntimeModeler.processMethod(RuntimeModeler.java:546)     at com.sun.xml.ws.model.RuntimeModeler.processClass(RuntimeModeler.java:370)     at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:256)     at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:322)     at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:188)     at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:467)     at org.jvnet.jax_ws_commons.spring.SpringService.getObject(SpringService.java:333)     at org.jvnet.jax_ws_commons.spring.SpringService.getObject(SpringService.java:45)     at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:121) 

Adding @XmlRootEntity to InvalidInputException does not solve the problem.

If this is not the recommended way to report faults over web services, then is there a better way? Should my exceptions inherit from RuntimeException and rely on the transport for the error handling (i.e., everything will end up wrapped in a SOAPException)? I was hoping for something like Spring-WS' SoapFaultAnnotationExceptionResolver. Is there something similar at all available for JAX-WS?

like image 569
waxwing Avatar asked Jan 14 '10 13:01

waxwing


People also ask

What is SOAP fault exception?

SOAP faults are generated by receivers to report business logic errors or unexpected conditions. In JAX-WS, Java exceptions ( java. lang. Exception ) that are thrown by your Java Web service are mapped to a SOAP fault and returned to the client to communicate the reason for failure.

Which element can give information about service specific exceptions and their mapping to exception classes?

(1) Processing of service-specific exceptions The WSDL faults and Java exceptions are mapped according to the JAX-WS 2.2 specifications. The following figure shows an example of mapping between the WSDL faults and Java exception classes.

What is WSDL fault?

Fault messages defined in the WSDL file are called declared faults . Fault messages that are not defined in the WSDL file are called undeclared faults . The process for generating a fault message is implementation dependent and typically depends on whether the fault is declared or not.

What is JAX-WS used for?

JAX-WS is a technology for building web services and clients that communicate using XML. JAX-WS allows developers to write message-oriented as well as RPC-oriented web services. In JAX-WS, a web service operation invocation is represented by an XML-based protocol such as SOAP.


1 Answers

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.

like image 194
Pascal Thivent Avatar answered Sep 29 '22 19:09

Pascal Thivent