Me estoy rascando la cabeza con esto: Usando un Interceptor para verificar algunos encabezados SOAP, ¿cómo puedo abortar la cadena del interceptor pero todavía responder con un error al usuario ?CXF WS, Interceptor: detener el procesamiento, responder con un error
Lanzando una falla funciona con respecto a la salida, pero la solicitud todavía se está procesando y prefiero que no todos los servicios comprueben si hay algún indicador en el contexto del mensaje.
Anulando con "message.getInterceptorChain(). Abort();" realmente aborta todo el procesamiento, pero tampoco se devuelve nada al cliente.
¿Cuál es el camino correcto a seguir?
public class HeadersInterceptor extends AbstractSoapInterceptor {
public HeadersInterceptor() {
super(Phase.PRE_LOGICAL);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
Exchange exchange = message.getExchange();
BindingOperationInfo bop = exchange.getBindingOperationInfo();
Method action = ((MethodDispatcher) exchange.get(Service.class)
.get(MethodDispatcher.class.getName())).getMethod(bop);
if (action.isAnnotationPresent(NeedsHeaders.class)
&& !headersPresent(message)) {
Fault fault = new Fault(new Exception("No headers Exception"));
fault.setFaultCode(new QName("Client"));
try {
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().newDocument();
Element detail = doc.createElementNS(Soap12.SOAP_NAMESPACE, "mynamespace");
detail.setTextContent("Missing some headers...blah");
fault.setDetail(detail);
} catch (ParserConfigurationException e) {
}
// bad: message.getInterceptorChain().abort();
throw fault;
}
}
}
No se puede lanzar una falta y dejar que CXF manejar la ¿descanso? –
Sí, puedo lanzar esa falla y el cliente recibe una respuesta de falla que es absolutamente lo que quiero, pero la solicitud aún se procesa en los servicios web. Esto me obliga a comprobar si el cliente está autenticado en todos los métodos en cada WebService, que es exactamente lo que no quiero hacer (transversal y que viola DRY). – Alex
Le pregunté porque cuando verifiqué el origen del código que implementa la cadena de procesamiento, parece que maneja fallas al abortar internamente. Sin embargo, el código no está 100% claro. –