CXF的异常处理

关于CXF的其他介绍,大家可以参考:http://blog.csdn.net/accountwcx/article/details/47082487,本文主要考虑CXF的统一异常处理。

CXF默认的异常处理
CXF的中的异常,最终都会被包装成Fault对象,在CXF自定义的拦截器中,常常见到如下代码:

throw new Fault(new RuntimeException("异常信息"));

默认情况下,CXF使用xml返回,那么默认的异常处理应该没有问题(我主要使用的是Json方式处理,所有在默认情况下异常是否有问题没有深入验证过,此处如有错误,请各位提示,谢谢)

我们这里主要说说CXF在使用restful返回json时的异常处理。至于为什么要处理,我想不用多说,我们不可能给客户返回java.lang.RuntimeException这样的提示吧。

异常出现的地方
服务方法中抛出的异常:当然,这些异常我们其实可以在方法中使用try ... catch ...直接处理,避免在服务方法中抛出异常。但如果我们想像Spring MVC一样统一处理异常呢?此类型的异常,我们可以通过输出异常拦截器进行处理。
拦截器中抛出的异常:CXF有许多默认运行的拦截器,在其中抛出的异常使用拦截器进行处理好像有些问题,他会多出xml的返回结果。这不是我们想要的。比如:当我们访问一个不存在的uri时,cxf的JAXRSInInterceptor拦截器会抛出ClientErrorException的子类,NotFoundException异常,我们使用JSon返回的时候,返回值为空,什么都没有,只有控制台能看到内容。
ExceptionMapper接口
public interface ExceptionMapper<E extends Throwable> {
    Response toResponse(E exception);
}
使用ExceptionMapper接口来实现统一异常处理,Response是CXF定义的返回对象。其泛型就是我们要处理的异常类

CXF中org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper是该接口的一个默认实现,但其实现太复杂,由于我们在转json的时候使用了Jackson,Jackson中有他的实现类,如:

com.fasterxml.jackson.jaxrs.base.JsonMappingExceptionMapper

public class JsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> {
    @Override
    public Response toResponse(JsonMappingException exception) {
        return Response.status(Response.Status.BAD_REQUEST).entity(exception.getMessage()).type("text/plain").build();
    }
}
我们可以看到,它的实现非常简单,我们来依葫芦画瓢
处理自定义异常MyException类的Mapper
import com.yyoo.cxf.restful.exception.FaultBean;
import com.yyoo.cxf.restful.exception.MyException;
 
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
 
public class MyExceptionMapper implements ExceptionMapper<MyException>{
    @Override
    public Response toResponse(MyException exception) {
    exception. printStackTrace();//--此处建议使用log
        FaultBean f = new FaultBean(exception.getMessage(),Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
 
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(f).type("application/json;charset=UTF-8").build();
    }
}
说明:

MyException:自定义异常。根据你的需要自定义即可,该ExceptionMapper会处理该异常及其子类异常。
FaultBean:自定义返回结果类,最后CXF返回的json就是该类。根据你的需要自定义
entity方法:就是把自定义的返回结果类设置到Response对象
type方法:设置返回的格式为json,编码为UTF-8
配置xml文件
       <jaxrs:providers>
            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider" />
            <bean class="com.yyoo.cxf.restful.exception.mapper.MyExceptionMapper"/>
            <bean class="com.yyoo.cxf.restful.exception.mapper.ClientErrorExceptionMapper"/>
            <bean class="com.yyoo.cxf.restful.exception.mapper.OtherExceptionMapper"/>
        </jaxrs:providers>
说明:

JacksonJaxbJsonProvider:这个是我们使用CXF返回json的Jackson的Provider对象,该配置在返回Json时是必须的。
MyExceptionMapper:上面定义的ExceptionMapper
ClientErrorExceptionMapper:示例中未贴出代码,因为和MyExceptionMapper一样。主要处理了ClientErrorException及其子类的异常,包括404、403等http的客户端异常。当然你也可以为ClientErrorException的每个子类创建ExceptionMapper。
OtherExceptionMapper:直接处理的Exception对象,处理以上Exception以外的所有Exception异常及其子类。

————————————————
版权声明:本文为CSDN博主「羽扇纶巾YY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/forlinkext/article/details/78115640

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章