2013-07-15 2 views
0

Я пишу клиент для веб-службы, и я хочу сделать две вещи, используя interceptor - 1) Запишите исходящее XML-сообщение и 2) Прочитайте ответ HTTP, а не ответ SOAP ,Перехватчик CXF не вызван для чтения ответа HTTP

Сопровождающая сторона имеет только метод void, и они просто подтверждают получение моего сообщения через код ответа HTTP.

Это то, что их реакция выглядит следующим образом:

HTTP/1.1 202 Accepted 
Date: Wed, 10 Jul 2013 23:06:36 GMT 
Server: Oracle-Application-Server-11g 
Content-Length: 0 
X-ORACLE-DMS-ECID: 004sJ1KLm7yB_6RjMX^QsA0002X30001U5 
X-Powered-By: Servlet/2.5 JSP/2.1 
Content-Type: 
Content-Language: en 
X-F5-ServerSSL-Profile: serverssl_sys_soaorexafun 
X-F5-ForwardProxy-Host: 64.181.184.15%819 443 

мне нужен ответ "HTTP/1.1 202 Принято".

Мой перехватчик код:

package com.cambiahealth.orservice.client; 

import org.apache.cxf.binding.soap.interceptor.EndpointSelectionInterceptor; 
import org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor; 
import org.apache.cxf.interceptor.Fault; 
import org.apache.cxf.message.Message; 
import org.apache.cxf.phase.AbstractPhaseInterceptor; 
import org.apache.cxf.phase.Phase; 
import org.apache.log4j.Logger; 

public class CoverOregonServiceInterceptor extends AbstractPhaseInterceptor<Message> { 

    static Logger logger = Logger.getLogger(CoverOregonServiceInterceptor.class.getName()); 
    private static Integer responseCode = 0; 

    public CoverOregonServiceInterceptor() { 
     super(Phase.POST_INVOKE); 
     addAfter(ReadHeadersInterceptor.class.getName()); 
     addAfter(EndpointSelectionInterceptor.class.getName()); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     try{ 
      responseCode = (Integer) message.get(Message.RESPONSE_CODE); 
      logger.info("Response Code is " + responseCode); 
     } catch (Exception e){ 
      logger.error("Failed to read the response code from Soap message", e); 
     }   
    } 

    public Integer getResponseCode(){ 
     return responseCode; 
    } 

} 

И код в моем клиенте:

String wsdlUrl = coverOregonServiceUrl + "?wsdl"; 
CoverOregonServiceInterceptor interceptor = new CoverOregonServiceInterceptor(); 
CoverOregonServiceInterceptor outInterceptor = new CoverOregonServiceInterceptor(); 
InboundEnrollmentManagementClient client = new InboundEnrollmentManagementClient(
        new URL(wsdlUrl)); 
InboundEnrollManagementPortType port = client.getInboundEnrollManagementPort(); 
Client cxfClient = ClientProxy.getClient(port); 
cxfClient.getInInterceptors().add(interceptor); 
cxfClient.getOutFaultInterceptors().add(outInterceptor); 
port.statusupdate(request); 

Однако мой перехватчик не получает вызова/срабатывает на всех. Я пробовал разные фазы - ЧИТАТЬ, ПОЛУЧИТЬ, PRE_INVOKE, POST_INVOKE, INVOKE, POST_STREAM, SEND. Но никто из них не работал. Я попробовал аналогичный перехватчик для регистрации XML-сообщения перед отправкой запроса. И он тоже не работает. Какие-либо предложения?

+0

Вы пробовали с PRE_STREAM (как org.apache.cxf.interceptor.LoggingOutInterceptor делает) – willome

+0

PRE_STREAM работал в лесозаготовительной перехватчик для получения сообщения XML. Благодарю. – rishi

ответ

0

Выяснил это. Служба, которую я вызываю, не имеет возврата, поэтому я не могу использовать входящую цепочку перехватчиков.

cxfClient.getInInterceptors().add(interceptor); 

Я использовал его в исходящей цепи, и это сработало.

cxfClient.getOutInterceptors().add(outInterceptor); 
Смежные вопросы