Java 如何让CXF将异常记录到错误通道?
在我当前安装的Spring CXF JAX-RS Servlet中,异常被记录到log4j调试通道:Java 如何让CXF将异常记录到错误通道?,java,spring,logging,cxf,jax-rs,Java,Spring,Logging,Cxf,Jax Rs,在我当前安装的Spring CXF JAX-RS Servlet中,异常被记录到log4j调试通道: DEBUG http-8134-2 org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper - WebApplicationException has been caught, status: 500, message: Unrecognized field "links" (Class Result), not marked as ign
DEBUG http-8134-2 org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper - WebApplicationException has been caught, status: 500, message: Unrecognized field "links" (Class Result), not marked as ignorable
at [Source: {"links"}; line: 1, column: 11] (through reference chain: bbc.news.naf.elections.data.model.client.Result["links"])
javax.ws.rs.WebApplicationException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "links" (Class Result), not marked as ignorable
at [Source: {"links":[{}; line: 1, column: 11] (through reference chain: bbc.news.naf.elections.data.model.client.Result["links"])
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:243)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:89)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:211)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:213)
显然,这并不理想。如何让CXF将这些异常堆栈跟踪记录到更相关的内容,如警告或错误?您需要在WebApplicationExceptionMapper类上启用printStackTrack功能。您可以通过将以下内容添加到Spring XML上下文中来实现这一点:
<jaxrs:providers>
<bean class="org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper">
<property name="printStackTrace" value="true" />
</bean>
</jaxrs:providers>
异常现在应该记录到log4j警告通道。编写一个简单的提供程序类,如下所示
public class ExceptionResponseBuilder
extends WebApplicationExceptionMapper {
Logger _logger = LoggerFactory.getLogger(this.getClass().getName());
public Response toResponse(WebApplicationException ex) {
//Do something to get the object you want to return.
// ex object will give you information you need
Response r = Response
.status(Response.Status.BAD_REQUEST)
.entity(set any object your want to return)
.build();
return r;
}
将以下内容添加到spring文件中
<bean id="exceptionResponseBuilder" class="com.orgname.project.provider.ExceptionResponseBuilder">
<property name="printStackTrace" value="true" />
</bean>
<jaxrs:providers>
<ref bean="exceptionResponseBuilder"/>
</jaxrs:providers>