Überprüfte Ausnahmehierarchie in Webdiensten mit dem JAX-WS Maven Plugin (wsimport)
-
28-10-2019 - |
Frage
Ich arbeite an einem Projekt, in dem wir aktivierte Ausnahmen verwenden möchten, um den Benutzer über (zum Beispiel) falsche Eingaben oder falsche Maßnahmen zu informieren. Solche Ausnahmen sollten eine Hierarchie haben wie:
public abstract class BusinessException extends java.lang.Exception {...}
public class InvalidInputException extends BusinessException {...}
public class InvalidActionException extends BusinessException {...}
Wir generieren Java-Code aus WSDL / XSD (Contract-First-Ansatz) unter Verwendung von Maven, jaxws-maven-plugin
und target wsimport
.
Ich habe versucht, dies zu befolgen ( http: / /www.ibm.com/developerworks/xml/library/ws-tip-jaxrpc.html ) Tutorial (es ist für jax-rpc, scheint aber auch für jax-ws zu funktionieren). Ich habe geschrieben
<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>
mit in ows definierten Typen: 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"/>
Wenn ich mvn clean package
ausführe, wird Folgendes angezeigt (Getter, Setter, Ctors und Annotationen wurden entfernt):
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;
(...)
}
Was ich nicht wollte, weil es eine Ausnahme gibt und es verschiedene faultInto
-Daten enthalten kann. Gibt es eine Möglichkeit, eine Ausnahmehierarchie wie oben in XSD / WSDL angegeben zu erstellen? Da die ExceptionMessage
-Klasse direkt aus dem <message>
-Tag generiert wird, konnte ich dort keine Möglichkeit finden, ein Elternteil / Kind zu erstellen.
Lösung 2
Es scheint, dass dies mit den oben genannten Technologien (WSDL / XSD (Contract-First-Ansatz) unter Verwendung von Maven, jaxws-maven-plugin
, wsimport
-Ziel) nicht möglich ist.
Andere Tipps
Könnten Sie die WSDL-Operation in ... ändern?
<portType name="TestWebService">
<operation name="throwException">
<input message="tns:empty"/>
<output message="tns:empty"/>
<fault name="fault" message="tns:BusinessException"/>
</operation>
</portType>