Gerarchia delle eccezioni verificata nei servizi Web utilizzando JAX-WS Maven Plugin (wsimport)
-
28-10-2019 - |
Domanda
Sto lavorando a un progetto in cui vogliamo utilizzare eccezioni verificate per notificare all'utente (ad esempio) input errato o azione errata intrapresa. Tali eccezioni dovrebbero avere una gerarchia come:
public abstract class BusinessException extends java.lang.Exception {...}
public class InvalidInputException extends BusinessException {...}
public class InvalidActionException extends BusinessException {...}
Generiamo codice java da WSDL / XSD (approccio al primo contratto) utilizzando Maven, jaxws-maven-plugin
, goal wsimport
.
Ho provato a seguire questo ( http: / /www.ibm.com/developerworks/xml/library/ws-tip-jaxrpc.html ) (è per jax-rpc, ma sembra funzionare anche per jax-ws). Ho scritto
<definitions ...>
<message name="empty"/>
<message name="ExceptionMessage">
<part name="fault" element="ows:ValidationException"/>
</message>
<portType name="TestWebService">
<operation name="throwException">
<input message="tns:empty"/>
<output message="tns:empty"/>
<fault name="fault" message="tns:ExceptionMessage"/>
</operation>
</portType>
<binding name="TestWebServicePortBinding"
type="tns:TestWebService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document"/>
<operation name="throwException">
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="fault">
<soap:fault name="fault" use="literal"/>
</fault>
</operation>
</binding>
...
</definitions>
con i tipi definiti in ows: namespace
<xs:complexType name="BusinessException" abstract="true">
<xs:sequence>
<xs:element name="code" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="InvalidInputException">
<xs:complexContent>
<xs:extension base="tns:BusinessException">
<xs:sequence>
<xs:element name="validationMessage" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="InvalidActionException">
<xs:complexContent>
<xs:extension base="tns:BusinessException">
<xs:sequence>
<xs:element name="actionName" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="ValidationException" type="tns:InvalidInputException"/>
Quando eseguo mvn clean package
, ottengo quanto segue (getter, setter, ctor e annotazioni rimossi):
public interface TestWebService {
@WebMethod
public void throwException() throws ExceptionMessage;
}
public class ExceptionMessage extends Exception {
private InvalidInputException faultInfo;
(...)
}
public abstract class BusinessException implements Serializable {
protected int code;
(...)
}
public class InvalidActionException extends BusinessException implements Serializable {
protected String actionName;
(...)
}
public class InvalidInputException extends BusinessException implements Serializable {
protected String validationMessage;
(...)
}
Che non è quello che volevo, perché c'è un'eccezione e può contenere diversi dati faultInto
. C'è un modo per creare la gerarchia delle eccezioni come indicato sopra puramente in XSD / WSDL? Poiché la classe ExceptionMessage
viene generata direttamente dal tag <message>
, non sono riuscito a trovare un modo per creare un genitore / figlio lì.
Soluzione 2
Sembra che ciò non sia possibile utilizzando le tecnologie sopra menzionate (WSDL / XSD (approccio al primo contratto) utilizzando Maven, jaxws-maven-plugin
, wsimport
goal).
Altri suggerimenti
Potresti cambiare l'operazione WSDL in ...
<portType name="TestWebService">
<operation name="throwException">
<input message="tns:empty"/>
<output message="tns:empty"/>
<fault name="fault" message="tns:BusinessException"/>
</operation>
</portType>