Como lançar uma falha personalizada em um serviço da Web JAX-WS?

Como você lança uma falha de soap personalizada em um serviço da Web JAX-WS? Como posso especificar o faultCode , faultString e detail da falha do soap? É possível definir o valor do detail como bean em vez de uma String ?

Por favor, note que estou desenvolvendo usando a abordagem de código primeiro.

Use a anotação @WebFault .

Você pode ver um bom exemplo em Usando Falhas e Exceções SOAP em Serviços da Web Java JAX-WS – Eben Hewitt em Java .

Você verá o exemplo:

 @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; } } 

ATUALIZAR

Outra maneira é declarar a exceção típica na cláusula throws .

Por exemplo, suponha que o seguinte seja minha class de exceção:

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

E a próxima aula é a implementação do serviço.

 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; } } 

Se meu pedido for:

     Peter    

Não há problema:

    Hello, Peter    

Mas…

         

Então…

    S:Server There is one error   There is one error      
 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 escolher o código de falha correto, consulte http://www.tutorialspoint.com/soap/soap_fault.htm .