Я ломаю голову над этим: Используя перехватчик для проверки нескольких SOAP-заголовков, как я могу прервать цепочку перехватчиков, но при этом ответить пользователю ошибкой?
Бросание ошибки работает в отношении вывода, но запрос все еще обрабатывается, и я бы не хотел, чтобы все службы проверяли наличие какого-то флага в контексте сообщения.
Прерывание с помощью "message.getInterceptorChain().abort();" действительно прерывает всю обработку, но тогда клиенту также ничего не возвращается.
Как правильно поступить?
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;
}
}
}