CXF之五(错误处理)
CXF之五(异常处理)
在CXF中默认的异常处理是无法满足开发需求,经常需要把异常信息转换为JSON或者XML格式,返回给客户的,这样就只能自定义异常处理了。
在对外提供接口的时候,如果出现异常,一般会通过JSON或XML将异常码及异常信息反回给客户,这在CXF中也很容易实现。
第一步:编写自己的异常处理类 InvokeFaultExceptionMapper
@Provider public class InvokeFaultExceptionMapper implements ExceptionMapper { public Response toResponse(Throwable ex) { StackTraceElement[] trace = new StackTraceElement[1]; trace[0] = ex.getStackTrace()[0]; ex.setStackTrace(trace); ResponseBuilder rb = Response.status(Response.Status.INTERNAL_SERVER_ERROR); rb.type("application/json;charset=UTF-8"); rb.entity(ex); rb.language(Locale.SIMPLIFIED_CHINESE); Response r = rb.build(); return r; } }
第二部:加载InvokeFaultExceptionMapper
<jaxrs:server id="expGateway" address="/expGateway"> <jaxrs:inInterceptors> <ref bean="inMessageInterceptor"/> </jaxrs:inInterceptors> <jaxrs:outInterceptors> <ref bean="outMessageInterceptor"/> </jaxrs:outInterceptors> <jaxrs:serviceBeans> <ref bean="expGatewayImpl" /> </jaxrs:serviceBeans> <jaxrs:extensionMappings> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> </jaxrs:extensionMappings> <jaxrs:languageMappings> <entry key="en" value="en-gb" /> </jaxrs:languageMappings> <jaxrs:providers> <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/> <bean class="com.pml.service.outer.InvokeFaultExceptionMapper"/> </jaxrs:providers> </jaxrs:server>
第三步:测试
在你的接口中跑出异常试一试,结果如下
{"operate":null,"errCode":0,"errSubCode":"err.001","cause":null,"message":"ID值异常!","localizedMessage":"ID值异常!","stackTrace":[{"className":"com.pml.service.outer.ExpGatewayImpl","fileName":"ExpGatewayImpl.java","lineNumber":59,"methodName":"getUser","nativeMethod":false}]}