2010-02-03 13 views
14

Ich arbeite an einem Apache CXF-Webservice (mit JAX-WS, über SOAP). Der Dienst selbst ist ziemlich einfach: Empfangen Sie eine Anfrage, fügen Sie die Anfrage in eine Datenbank ein und geben Sie zurück, ob die Einfügung erfolgreich war. Ich möchte mich auf die XML-Validierung verlassen, um eine Reihe von Einschränkungen für die Anforderung durchzusetzen.Server-Side XML Validation mit CXF Webservice

Also, meine Frage. Wie gebe ich detaillierte Validierungsfehler an einen Kunden meines Dienstes zurück? Ich habe die Validierung serverseitig durch Konfigurieren meines Endpunkts aktiviert.

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl"> 
    <jaxws:properties> 
     <!-- This entry should- ideally- enable JAXB validation 
     on the server-side of our web service. --> 
     <entry key="schema-validation-enabled" value="true" /> 
    </jaxws:properties> 
</jaxws:endpoint> 

Ich habe erforscht mit Abfangjäger (zB BareInInterceptor) auf dem Server, und irgendwie fangen SAXParseExceptions sie wickeln und sie zusammen an den Client zu senden. Dieser Ansatz scheint ein wenig kompliziert zu sein, aber ich muss Kunden irgendwie eine Zeilennummer geben, wenn ihr XML ungültig ist. Soll ich mit Abfangjägern gehen, um die Ausnahmen aufzudecken?

Ich bin nicht sehr erfahren mit dieser Technologie-Stack, und nur in Web-Services - alle Hinweise, die Sie mir geben können, würde wirklich geschätzt werden.

+2

Bedenken Sie, dass, wenn das XML in Ihrer Anfrage von einer SOAP-Client-Anwendung generiert wird (wie es beim Generieren von Stubs von Ihrem eigenen Service der Fall ist), Ihre Zeilennummer sehr oft 1 ist Clients generieren einfach ein XML-Dokument mit einer sehr langen Zeile. –

+0

@Ian McLaird: das ist gültig Kommentare, auf der anderen Seite, wenn die Anwendung von Testern getestet wird, verwenden sie bessere Formatierung und das wird ihnen helfen – Betlista

Antwort

26

Sie können mithilfe einer benutzerdefinierten Validation Validierung Fehlermeldungen, Einfügen einer Zeilennummer, außer Kraft setzen:

package example; 

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.helpers.DefaultValidationEventHandler; 

public class MyValidationEventHandler extends DefaultValidationEventHandler {  
    @Override 
    public boolean handleEvent(ValidationEvent event) { 
     if (event.getSeverity() == ValidationEvent.WARNING) { 
      return super.handleEvent(event); 
     } else { 
      throw new RuntimeException(event.getMessage() 
       + " [line:"+event.getLocator().getLineNumber()+"]"); 
     } 
    } 
} 

Wenn Sie Ihren Endpunkt konfigurieren diese Prozedur zu verwenden:

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl"> 
    <jaxws:properties> 
     <entry key="schema-validation-enabled" value="true" /> 
     <entry key="jaxb-validation-event-handler"> 
      <bean class="example.MyValidationEventHandler" /> 
     </entry> 
    </jaxws:properties> 
</jaxws:endpoint> 

Dann werden Sie bekommen SOAP-Fehler, die wie folgt aussehen:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soap:Fault> 
      <faultcode>soap:Client</faultcode> 
      <faultstring>Unmarshalling Error: Not a number: xyz [line: 6]</faultstring> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

Die Jaxb-Validierung-ev Die Ent-Handler-Eigenschaft wurde erst vor kurzem zu CXF hinzugefügt. Sie müssen also sicherstellen, dass Sie die neueste Version verwenden - ich habe dies mit 2.2.5 getestet.

+0

Ich werde dies einen Versuch am Morgen geben! –

+0

Das funktioniert großartig, Meer - die Beute gehört dir. –

+0

Es scheint, dass dieser Ansatz für CXF 2.2.9 nicht richtig funktioniert. Dies liefert immer noch die Zeilennummer für den Fall, wenn ein falscher Datumswert angegeben wurde, die Zeilennummer jedoch falsch ist. Für andere Ausnahmen, z.B. Gebrochene Einschränkung für die Länge der Zeichenkette Dies wird keine Zeilennummer anhängen, und inittil SAXParseException wird zurückgegeben. So, wie ich es verstehe, gibt es einen Weg - Fehler zu behandeln und Reparieren Dokument, wenn SAXParseExceptions erhalten. – Milkywayfarer