Pergunta

Estou trabalhando em um Apache CXF WebService (usando o JAX-WS, SOAP). O serviço em si é bastante simples: receba uma solicitação, insira a solicitação em um banco de dados e retorne se a inserção foi bem -sucedida. Eu gostaria de confiar na validação XML para aplicar uma série de restrições na solicitação.

Então, minha pergunta. Como retorno erros de validação detalhados a um cliente do meu serviço? Virei a validação no lado do servidor, configurando meu terminal.

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

Explorei o uso de interceptores (por exemplo, BareIninterceptor) no servidor e, de alguma forma, pegando saxparseexceptions para envolvê -los e enviá -los para o cliente. Essa abordagem parece um pouco complicada, mas preciso de alguma forma dar aos clientes um número de linha se o XML for inválido. Devo ir com os interceptores para expor as exceções?

Não tenho muita experiência com essa pilha de tecnologia e apenas entrando em serviços da web- quaisquer indicadores que vocês possam me dar seriam realmente apreciados.

Foi útil?

Solução

Você pode substituir as mensagens de erro de validação, inserindo um número de linha, usando um ValidationEventHandler personalizado:

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 você configurar seu terminal para usar este manipulador:

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

Então você terá falhas de sabão que se parecem com o seguinte:

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

A propriedade Jaxb-Validation-Event-Mandler foi adicionada apenas ao CXF recentemente, então você precisa garantir que está usando a versão mais recente-testei isso com 2.2.5.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top