tutorial servicios jax español desde crear consumir cero java web-services exception jax-ws soapfault

servicios - web service java netbeans



¿Cómo lanzar una falla personalizada en un servicio web JAX-WS? (2)

¿Cómo se lanza una falla de jabón personalizada en un servicio web JAX-WS? ¿Cómo puedo especificar el faultCode , faultString y el detail de la falla de jabón? ¿Es posible establecer el valor del detail como bean en lugar de String ?

Tenga en cuenta que estoy desarrollando el uso de un enfoque de primer código.


Use la anotación @WebFault .

Puede ver un buen ejemplo en Uso de fallas y excepciones SOAP en Java JAX-WS Web Services - Eben Hewitt en Java .

Verás el ejemplo:

@WebFault(name="CheckVerifyFault", targetNamespace="http://www.example.com") public class CheckVerifyFault extends Exception { /** * Java type that goes as soapenv:Fault detail element. */ private CheckFaultBean faultInfo; public CheckVerifyFault(String message, CheckFaultBean faultInfo) { super(message); this.faultInfo = faultInfo; } public CheckVerifyFault(String message, CheckFaultBean faultInfo, Throwable cause) { super(message, cause); this.faultInfo = faultInfo; } public CheckFaultBean getFaultInfo() { return faultInfo; } }

ACTUALIZAR

Otra forma es declarar la excepción típica en la cláusula throws .

Por ejemplo, supongamos que la siguiente es mi clase de excepción:

package pkg.ex; public class FooException extends Exception { public FooException(String message, Throwable cause) { super(message, cause); } }

Y la siguiente clase es la implementación del servicio.

package pkg.ws; import javax.jws.WebService; import pkg.ex.FooException; @WebService(serviceName = "FooSvc") public class FooService { public String sayHello(String name) throws FooException { if (name.isEmpty()) { Throwable t = new IllegalArgumentException("Empty name"); throw new FooException("There is one error", t); } return "Hello, " + name; } }

Si mi solicitud es:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.pkg/"> <soapenv:Header/> <soapenv:Body> <ws:sayHello> <arg0>Peter</arg0> </ws:sayHello> </soapenv:Body> </soapenv:Envelope>

No hay ningún problema:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:sayHelloResponse xmlns:ns2="http://ws.pkg/"> <return>Hello, Peter</return> </ns2:sayHelloResponse> </S:Body> </S:Envelope>

Pero...

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.pkg/"> <soapenv:Header/> <soapenv:Body> <ws:sayHello> <arg0></arg0> </ws:sayHello> </soapenv:Body> </soapenv:Envelope>

Entonces...

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"> <faultcode>S:Server</faultcode> <faultstring>There is one error</faultstring> <detail> <ns2:FooException xmlns:ns2="http://ws.pkg/"> <message>There is one error</message> </ns2:FooException> </detail> </S:Fault> </S:Body> </S:Envelope>


import javax.xml.soap.SOAPFactory; import javax.xml.soap.SOAPFault; import javax.xml.ws.soap.SOAPFaultException; import javax.xml.namespace.QName; ... SOAPFactory soapFactory = SOAPFactory.newInstance(); SOAPFault soapFault = soapFactory.createFault( "Your custom message", new QName("http://schemas.xmlsoap.org/soap/envelope/", "Client")); throw new SOAPFaultException(soapFault);

Para elegir el código de falla correcto, consulte http://www.tutorialspoint.com/soap/soap_fault.htm .