Validação XML do lado do servidor com CXF Web Service
-
25-09-2019 - |
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.
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.