CXF WS, Interceptor: stop processing, respond with fault

Я ломаю голову над этим: Используя перехватчик для проверки нескольких 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;
        }
    }
}
6
задан Alex 6 December 2011 в 18:41
поделиться