2016-07-26 1 views

ответ

2

Ваш перехватчик должен простираться от AbstractPhaseInterceptor или подкласса

public class MyInterceptor extends AbstractPhaseInterceptor<Message> { 
    public MyInterceptor() { 
     super(Phase.RECEIVE); 
    } 

    public void handleMessage(Message message) { 
     //Get the message body into payload[] and set a new non-consumed inputStream into Message 
     InputStream in = message.getContent(InputStream.class); 
     byte payload[] = IOUtils.readBytesFromStream(in); 
     ByteArrayInputStream bin = new ByteArrayInputStream(payload); 
     message.setContent(InputStream.class, bin); 
    } 

    public void handleFault(Message messageParam) { 
     //Invoked when interceptor fails 
    } 
} 

Добавить перехватчик программно

MyInterceptor myInterceptor = new MyInterceptor(); 

Server server = serverFactoryBean.create(); 
server.getEndpoint().getInInterceptor().add(myInterceptor); 

Или с использованием конфигурации

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:cxf="http://cxf.apache.org/core" 
     xsi:schemaLocation=" 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"> 

    <bean id="MyInterceptor" class="demo.interceptor.MyInterceptor"/> 

    <!-- We are adding the interceptors to the bus as we will have only one endpoint/service/bus. --> 

    <cxf:bus> 
     <cxf:inInterceptors> 
      <ref bean="MyInterceptor"/> 
     </cxf:inInterceptors> 
     <cxf:outInterceptors> 
      <ref bean="MyInterceptor"/> 
     </cxf:outInterceptors> 
    </cxf:bus> 
</beans> 

Проверка документации here

+0

@ pedrofb какой код я пишу в методе handleMessage для того, чтобы получить полезную нагрузку ... Я новичок в CXF .. –

+0

Посмотрите в исходном коде CXF 'LoggingInInterceptor.handleMessage' и' LoggingOutInterceptor.handleMessage'. Эти классы позволяют печатать полное сообщение в журналах. Вы можете скопировать и вставить оттуда http://grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-core/3.1.1/org/apache/cxf/interceptor/LoggingInInterceptor.java # LoggingInInterceptor.handleMessage% 28org.apache.cxf.message.Message% 29 – pedrofb

+0

@ pedrofb Я уже распечатал полное сообщение в журналах, используя LoggingInInterceptor и LoggingOutInterceptor .... Я хочу извлечь эту полезную нагрузку в классе java, когда конец пользователь отправляет данные ... извините, если я здесь что-то отсутствует. –

0

Вы можете использовать LoggingInInterceptor для извлечения полезной нагрузки в виде строки

public class CustomInInterceptor extends LoggingInInterceptor { 

    /** 
    * SLF4J Log Instance 
    */ 
    private final static Logger LOG = LoggerFactory.getLogger(CustomInInterceptor.class); 

    /** 
    * formats logging message and also attaches input xml to thread context 
    * 
    * @see org.apache.cxf.interceptor.LoggingInInterceptor#formatLoggingMessage(org.apache.cxf.interceptor.LoggingMessage) 
    */ 
    @Override 
    protected String formatLoggingMessage(final LoggingMessage loggingMessage) { 
    //The below line reads payload and puts into threads context, which I use later to save in db 
    KpContextHolder.setInputXml(loggingMessage.getPayload().toString()); 
     return super.formatLoggingMessage(loggingMessage); 
    } 

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