2014-01-17 4 views
1

Я использую Apache Camel CXF для интеграции SOAP WebService. Все работает нормально, но я заметил, что мой ответ возвращается как HTTP 202 вместо 200. Меня это беспокоит, потому что я знаю многих людей с жестким кодом, например if(httpCode == 200) {...}, и это может сломать текущую услугу.Apache Camel CXF отклик 202 вместо 200

Я попытался использовать разные перехватчики, чтобы переопределить HTTP-код от 202 до 200, но не повезло. Кроме того, 202 означает Accepted, что означает, что запрос находится в процессе, но не завершен. 200 означает OK, что означает, что процесс завершен. Означает ли это, что я делаю что-то неправильно в своем маршруте?

Каков правильный способ его устранения? Перехватчик? Настройка заголовков верблюдов? Что-то делать, чтобы сказать, что оно завершено?

Я использую Apache Camel 2.12.1 и режим PAYLOAD.

EDIT: Кажется, что-то связано с конечной точкой OneWay. Есть ли способ деактивировать это?

EDIT2: После нескольких часов работы, я думаю, что у меня есть первопричина. Мой WSDL не определяет выход для этой конкретной операции. Я не могу изменить WSDL. Тем не менее, я считаю, что, когда CXF использует WSDL для создания конечной точки, он автоматически предполагает, что это конечная точка OneWay, поскольку нет выхода. Это означает, что ответ отправляется обратно, как только мы получаем запрос с кодом 202. Кроме того, я считаю, что по этой причине нет цепи OutInteceptor. Лично я считаю, что это нормально отправить назад 202, но это требование к сервису, чтобы отправить обратно 200. Есть ли какая-либо конфигурация, которую я изменяю в CXF, чтобы установить это в режиме конечной точки OneWay?

+0

Односторонние операции имеют смысл возвратить 202 [хотя возможно и 200] (http://docs.oracle.com/cd/B40099_02/books/EAI2/EAI2_WebServices6.html). [CXF поддерживает перехватчик, который отправляет 202 сразу после фазы чтения] (http://cxf.547215.n5.nabble.com/OneWay-interpretation-and-HTTP-binding-td5711719.html) - вы, вероятно, можете перехватить 202 [похоже на этот подход] (http://stackoverflow.com/questions/7575970/how-can-i-prevent-apache-cxf-from-sending-a-response-message) или [это предложение здесь] (http://stackoverflow.com/questions/18976369/intercept-http-response-with-cxf) –

+0

Спасибо за ваш комментарий. Поэтому я пробовал здесь разные возможности, но не повезло. Я собираюсь отредактировать мой пост, чтобы предоставить дополнительную информацию. – hveiga

ответ

1

Наконец, мы нашли перехватчик для этого, что:

public class SoapResponseInterceptor extends AbstractSoapInterceptor { 

    public SoapResponseInterceptor() { 
     super(Phase.PRE_LOGICAL); 
    } 

    @Override 
    public void handleMessage(SoapMessage message) throws Fault { 
     message.getExchange().setOneWay(false); 
    } 
} 

Надеется, что это помогает!

Смежные вопросы