CXF统一异常处理

关于CXF的其他介绍,此处不做讨论,本文主要考虑CXF的统一异常处理。

目录

CXF默认的异常处理

异常出现的地方

ExceptionMapper接口


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异常及其子类。

 

 

 

 

 

 

 

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值