2017-10-12 2 views
0

Apache CXF를 기반으로하는 웹 서비스가 있습니다. http 응답 코드가 포함 된 특정 항목을 로깅하기위한 인터셉터를 작성했습니다.CXF 인터셉터에서 HTTP 응답 코드를 얻는 방법은 무엇입니까?

public class MyOutInterceptor extends AbstractPhaseInterceptor<Message> { 

    public MyOutInterceptor() { 
     super(Phase.SEND); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     Integer responseCode = (Integer) message.get(Message.RESPONSE_CODE); 
     //... 
    } 
} 

BUT !!! responseCodenull입니다. 인터셉터 단계를 변경하더라도 항상 null입니다.
CXF 인터셉터에서 http 응답 코드를 얻으려면 어떻게해야합니까?


UPD. 응용 프로그램 봄/CXF 구성 : https://gist.github.com/alexiuscrow/b5ceb2df7d652a77cd788454e0792211


UPD.

@Override 
public void handleMessage(Message message) throws Fault { 
    Integer responseCode = (Integer) message.get(Message.RESPONSE_CODE); 
    if (null == responseCode) { 
     HttpServletResponseWrapper responseWrapper = 
      (HttpServletResponseWrapper) message.get(AbstractHTTPDestination.HTTP_RESPONSE); 
     responseCode = responseWrapper.getStatus(); 
    } 
    //... 
} 

답변

0

이 있는지 확인 임시 해결책은 당신이 outinterceptor하지 여기 등 outFaultInterceptor or FaultInterceptor에 대한 검증 예를 들어 인터셉터를 등록했습니다.

import org.apache.cxf.annotations.Provider; 
import org.apache.cxf.annotations.Provider.Type; 
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.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 

@Component 
@Provider(value=Type.OutInterceptor) 
public class KpOutInterceptor2 extends AbstractPhaseInterceptor<Message> { 

    private final static Logger LOG = LoggerFactory.getLogger(KpOutInterceptor2.class); 

    public KpOutInterceptor2() { 
     super(Phase.SEND); 

    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     LOG.info("JAXRS response status code is {}", message.get(Message.RESPONSE_CODE)); 
    } 

} 

또는 훨씬 더 좋은 방법은 JAXRS 2.0 표준 필터를 사용하는 것입니다.

import java.io.IOException; 

import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 
import javax.ws.rs.ext.Provider; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 

@Component 
@Provider 
public class KpOutInterceptor implements ContainerResponseFilter { 

    private final static Logger LOG = LoggerFactory.getLogger(KpOutInterceptor.class); 

    @Override 
    public void filter(ContainerRequestContext reqCtx, ContainerResponseContext resCtx) throws IOException { 

     LOG.info("JAXRS response status code is {}", resCtx.getStatus()); 

    } 

} 
+0

확인했습니다. 그것은 outInterceptors에 묶여있다. – Alexiuscrow

+0

첫 번째 솔루션을 확인하십시오. 이미 구현 한 것과 동일하지만 다른 인터셉터를 등록한 것 같습니다. –

+0

인터셉터는 JAX-WS로 구성됩니다. 문제의 원인이 될 수 있습니까? 응용 프로그램 스프링/CXF 구성 : https://gist.github.com/alexiuscrow/b5ceb2df7d652a77cd788454e0792211 – Alexiuscrow

관련 문제