2011-02-04 14 views
6

Pracuję nad projektem, w którym chcemy używać sprawdzonych wyjątków, aby powiadomić użytkownika o (na przykład) błędnych danych wejściowych lub błędnych działaniach. Takie wyjątki powinny mieć hierarchia takich jak:Sprawdzana hierarchia wyjątków w WebServices przy użyciu wtyczki JAX-WS Maven (wsimport)

public abstract class BusinessException extends java.lang.Exception {...} 
public class InvalidInputException extends BusinessException {...} 
public class InvalidActionException extends BusinessException {...} 

Generujemy java kod z WSDL/XSD (podejścia pierwszego kontraktu) za pomocą Maven, jaxws-maven-plugin, Gol wsimport.

Próbowałem przejść ten sam (http://www.ibm.com/developerworks/xml/library/ws-tip-jaxrpc.html) samouczek (jest to dla jax-rpc, ale wydaje się również działać dla jax-ws). Pisałem

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

z typów określonych w 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"/> 

Kiedy biegnę mvn clean package, pojawia się następujący (pobierające, ustawiaczy, ctors i adnotacje usunięte):

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; 
    (...) 
} 

Nie jest to, co chciałem, ponieważ istnieje jeden wyjątek i może zawierać różne dane: faultInto. Czy istnieje sposób tworzenia hierarchii wyjątków, jak wspomniano powyżej w XSD/WSDL? Ponieważ klasa ExceptionMessage jest generowana bezpośrednio z tagu <message>, nie byłem w stanie znaleźć sposobu utworzenia elementu nadrzędnego/podrzędnego.

+0

Czy kiedykolwiek znalazłeś inne rozwiązanie? Mam do czynienia z mniej więcej tym samym problemem – santiagozky

+0

nie, zobacz moją odpowiedź poniżej. O ile się dowiedziałem, nie można tego zrobić w pierwszym kontrakcie z jaxws. –

Odpowiedz

0

Wydaje się, że nie jest to możliwe przy użyciu technologii, o których mowa powyżej (WSDL/XSD (podejście kontrakt pierwszego) przy użyciu Maven, jaxws-maven-plugin, wsimport cel) .

0

można zmienić operację WSDL do ...

<portType name="TestWebService"> 
    <operation name="throwException"> 
     <input message="tns:empty"/> 
     <output message="tns:empty"/> 
     <fault name="fault" message="tns:BusinessException"/> 
    </operation> 
</portType> 
+0

Mogę to zmienić, ale czy to pomoże mi stworzyć dziedziczenie wyjątków? (np. InvalidEputException rozszerza BusinessException) –

+0

Wygląda na to, że wygenerowany kod ma poprawne dziedziczenie. Jedynym problemem jest to, że twoja metoda throwException deklaruje, że rzuca ExceptionMessage zamiast BusinessException. – Pace