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

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