Mi sto graffiando: Utilizzando un Interceptor per controllare alcune intestazioni SOAP, come posso interrompere la catena dell'intercettore ma rispondere ancora con un errore all'utente ?CXF WS, Interceptor: interrompe l'elaborazione, risponde con errore
Il lancio di un errore riguarda l'output, ma la richiesta è ancora in fase di elaborazione e preferirei che non tutti i servizi controllino il flag nel contesto del messaggio.
Interruzione con "message.getInterceptorChain(). Abort();" interrompe davvero tutta l'elaborazione, ma poi non viene restituito nulla al client.
Qual è la strada giusta da percorrere?
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;
}
}
}
Non si può semplicemente gettare un guasto e far gestire la CXF riposo? –
Sì, posso lanciare quell'errore e il client riceve quindi una risposta di errore che è assolutamente quello che voglio, ma la richiesta è ancora elaborata nei servizi web. Ciò mi obbliga a verificare se il client è autenticato in ogni metodo in ogni WebService che è esattamente quello che non voglio fare (cross-cutting e violazione di DRY). – Alex
Ho chiesto perché quando ho controllato l'origine del codice che implementa la catena di elaborazione, _seems_ per gestire gli errori eseguendo l'abort internamente. Il codice non è chiaro al 100%. –