Question

Je travaille sur un Apache CXF webservice (en utilisant JAX-WS, sur SOAP). Le service lui-même est assez simple: recevoir une demande, insérer la demande dans une base de données, et le retour si l'insert a réussi. Je voudrais compter sur la validation XML pour appliquer un certain nombre de contraintes qui pèsent sur la demande.

Alors, ma question. Comment puis-je retourner des erreurs de validation détaillées à un client de mon service? Je suis devenu validation côté serveur en configurant mon point final.

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

J'ai exploré à l'aide des intercepteurs (par exemple BareInInterceptor) sur le serveur, et en quelque sorte attraper SAXParseExceptions pour les envelopper et les envoyer au client. Cette approche semble un peu compliqué, mais je dois donner en quelque sorte clients un numéro de ligne si leur XML est invalide. Dois-je aller avec des intercepteurs pour exposer les exceptions?

Je ne suis pas très expérimenté avec cette pile de technologie, et juste pour obtenir tous les pointeurs web services- gars, vous pouvez me donner serait vraiment apprécié.

Était-ce utile?

La solution

Vous pouvez remplacer les messages d'erreur de validation, l'insertion d'un numéro de ligne, en utilisant un ValidationEventHandler personnalisé:

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()+"]");
        }
    }
}

Si vous configurez votre terminal pour utiliser ce gestionnaire:

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

Ensuite, vous obtiendrez les fautes SOAP qui ressemblent à ceci:

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

La propriété-gestionnaire JAXB validation événement n'a été ajouté à CXF assez récemment, vous devez vous assurer que vous utilisez la dernière version -. Je l'ai testé cela avec 2.2.5

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top