Frage

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

Also meine Frage. Wie kehre ich detaillierte Validierungsfehler an einen Kunden meines Dienstes zurück? Ich habe die Validierung auf serverseitig durch Konfiguration meines Endpunkts gedreht.

<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 die Verwendung von Interceptors (z. B. bareInInterceptor) auf dem Server untersucht und Saxparseexceptions irgendwie fangen, um sie zu wickeln und an den Client zu senden. Dieser Ansatz scheint etwas kompliziert, aber ich muss den Kunden irgendwie eine Zeilennummer geben, wenn ihr XML ungültig ist. Sollte ich mit Abfangjäger gehen, um die Ausnahmen aufzudecken?

Ich bin mit diesem Technologie-Stack nicht sehr erfahren und stehe nur in Webdienste ein- alle Hinweise, die ihr mir geben, wäre sehr geschätzt.

War es hilfreich?

Lösung

Sie können Validierungsfehlermeldungen überschreiben und eine Zeilennummer einfügen, indem Sie einen benutzerdefinierten ValidationEventHandler verwenden:

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 für diesen Handler konfigurieren:

<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 erhalten Sie Seifenfehler, die so 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-VALIDATION-EVENT-Handler-Eigenschaft wurde nur vor kurzem zu CXF hinzugefügt. Sie müssen daher sicherstellen, dass Sie die neueste Version verwenden-ich habe dies mit 2.2.5 getestet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top