Domanda

Sto lavorando su un servizio Webs Websff Apache (usando Jax-WS, Over SOAP). Il servizio stesso è piuttosto semplice: ricevere una richiesta, inserire la richiesta in un database e restituire se l'inserto ha avuto successo. Vorrei fare affidamento sulla convalida XML per far rispettare una serie di vincoli sulla richiesta.

Quindi, la mia domanda. Come posso restituire errori dettagliati di convalida a un cliente del mio servizio? Ho girato la convalida sul lato server configurando il mio endpoint.

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

Ho esplorato usando gli intercettori (ad es. BareInInterceptor) sul server e in qualche modo catturando saxparsexceptions per avvolgerli e inviarli al client. Questo approccio sembra un po 'complicato, ma devo in qualche modo dare ai clienti un numero di riga se il loro XML non è valido. Dovrei andare con gli intercettori per esporre le eccezioni?

Non ho molto esperto con questo stack tecnologico e sto solo entrando nei servizi Web: tutti i suggerimenti che voi ragazzi potete darmi sarebbero davvero apprezzati.

È stato utile?

Soluzione

È possibile sovrascrivere i messaggi di errore di convalida, inserendo un numero di riga, utilizzando una validazione personalizzata:

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

Se configura il tuo endpoint per utilizzare questo gestore:

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

Allora otterrai difetti di sapone che sembrano questo:

<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 proprietà JAXB-Validation-Event-Handler è stata aggiunta solo a CXF abbastanza recentemente, quindi devi assicurarti di utilizzare l'ultima versione: l'ho testato con 2.2.5.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top