apache cxf - rest - loggingOutInterceptor不适用于异常

时间:2017-11-21 09:00:15

标签: java rest cxf

我使用org.apache.cxf.jaxrs.JAXRSServerFactoryBean.JAXRSServerFactoryBean.

发布了休息服务

我已经安装了loggingOutInterceptor

(org.apache.cxf.interceptor.LoggingOutInterceptor) to outInterceptors and outFaultInterceptors for logging my response message.

如果一切正常且服务中没有错误,则会成功记录响应消息。

然而,当有错误(空指针异常)时,没有记录响应消息...我看到它被添加到链中,并且调用了handleMessage方法......但问题是onClose()方法 永远不会调用org.apache.cxf.interceptor.LoggingOutInterceptor.LoggingCallback ......

以下是错误案例的跟踪:

2017-11-21 11:41:32,324 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Adding interceptor org.apache.cxf.interceptor.LoggingOutInterceptor@193f344e to phase pre-stream
2017-11-21 11:41:32,324 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Adding interceptor org.apache.cxf.jaxrs.interceptor.JAXRSDefaultFaultOutInterceptor@86d0e58c to phase marshal
2017-11-21 11:41:32,324 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Chain org.apache.cxf.phase.PhaseInterceptorChain@d30c8c15 was created. Current flow:
  setup [ServerPolicyOutFaultInterceptor]
  prepare-send [MessageSenderInterceptor]
  pre-stream [LoggingOutInterceptor]
  marshal [JAXRSDefaultFaultOutInterceptor]
2017-11-21 11:41:32,325 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Invoking handleMessage on interceptor org.apache.cxf.ws.policy.ServerPolicyOutFaultInterceptor@bf3eb580
2017-11-21 11:41:32,325 : [DEBUG] [http-nio-8080-exec-1][ServerPolicyOutFaultInterceptor]  No binding operation info.
2017-11-21 11:41:32,325 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Invoking handleMessage on interceptor org.apache.cxf.interceptor.MessageSenderInterceptor@700e0b39
2017-11-21 11:41:32,330 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Adding interceptor org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor@3639c01b to phase prepare-send-ending
2017-11-21 11:41:32,331 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Chain org.apache.cxf.phase.PhaseInterceptorChain@d30c8c15 was modified. Current flow:
  setup [ServerPolicyOutFaultInterceptor]
  prepare-send [MessageSenderInterceptor]
  pre-stream [LoggingOutInterceptor]
  marshal [JAXRSDefaultFaultOutInterceptor]
  prepare-send-ending [MessageSenderEndingInterceptor]
    2017-11-21 11:41:32,331 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Invoking handleMessage on interceptor org.apache.cxf.interceptor.LoggingOutInterceptor@193f344e
    2017-11-21 11:41:38,862 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Invoking handleMessage on interceptor org.apache.cxf.jaxrs.interceptor.JAXRSDefaultFaultOutInterceptor@86d0e58c
    2017-11-21 11:41:40,245 : [DEBUG] [http-nio-8080-exec-1][PhaseInterceptorChain]  Invoking handleFault on interceptor org.apache.cxf.jaxrs.interceptor.JAXRSDefaultFaultOutInterceptor@86d0e58c
    2017-11-21 11:41:41,538 : [WARN ] [http-nio-8080-exec-1][PhaseInterceptorChain]  Exception in handleFault on interceptor org.apache.cxf.jaxrs.interceptor.JAXRSDefaultFaultOutInterceptor@86d0e58c
    2017-11-21 11:41:41,538 : [WARN ] [http-nio-8080-exec-1][PhaseInterceptorChain]  Exception in handleFault on interceptor org.apache.cxf.jaxrs.interceptor.JAXRSDefaultFaultOutInterceptor@86d0e58c
    org.apache.cxf.interceptor.Fault: null while invoking public javax.ws.rs.core.Response MYSERVICE(MYPARAM) with params [MYPARAMCLASS@85cc6acf].
        at or
g.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:166)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:140)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:192)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:103)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:191)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:301)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:220)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:276)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:785)
Caused by: java.lang.NullPointerException

*

以下是返回给客户的实际回复..

{
    "timestamp": 1511253701656,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "java.lang.NullPointerException",
    "message": "No message available",
    "path": "MYPATH"
}

如何使用loggingOutInterceptor记录错误响应?

我对肥皂服务使用相同的策略。那里不存在这个问题。 onClose()方法 错误时调用org.apache.cxf.interceptor.LoggingOutInterceptor.LoggingCallback。

非常感谢任何帮助...

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我也可以通过在outFaultInterceptors列表中注册OutLoggingInterceptor来解决这个问题。

这是我的春天背景:

<cxf:bus>
    <cxf:inInterceptors>
        <ref bean="inLoggingInterceptor"/>
    </cxf:inInterceptors>
    <cxf:outInterceptors>
        <ref bean="outLoggingInterceptor"/>
        <ref bean="addResponseHeaderInterceptor" />
    </cxf:outInterceptors>
    <cxf:outFaultInterceptors>
        <ref bean="outLoggingInterceptor" />
    </cxf:outFaultInterceptors>**    
</cxf:bus>