JBoss RestEasy框架配置異常統一處理
前提
- 利用JBoss restEasy框架搭建的restful java web後臺應用
- 希望通過統一的方式對restful接口拋出的異常進行處理封裝
步驟
1.定義異常處理類
- 異常處理類需要實現javax.ws.rs.ext.ExceptionMapper接口,代碼如下:
package xxx.xxx.xxx.common.ext;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.ext.ExceptionMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 統一處理接口拋出的異常
*
* Created by xuyh at 2017年7月12日 下午3:05:38.
*/
public class RestExceptionHandler implements ExceptionMapper<Exception> {
private static Logger logger = LoggerFactory.getLogger(RestExceptionHandler.class);
public Response toResponse(Exception exception) {
logger.warn(exception.getMessage());
//http返回碼
ResponseBuilder responseBuilder = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
//返回的數據
responseBuilder.entity(new Error(String.valueOf(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()), exception.getMessage()));
//返回的數據類型
responseBuilder.type(MediaType.APPLICATION_JSON);
return responseBuilder.build();
}
private class Error {
private String errorCode;//錯誤碼
private String errorMessage;//錯誤消息
public Error(String errorCode, String errorMessage) {
super();
this.errorCode = errorCode;
this.errorMessage = errorMessage;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
}
2.將定義好的異常處理類配置到restEasy
- 作者使用的servlet容器是Jetty並通過web.xml文件進行描述,因此在web.xml中定義異常處理信息,如下圖
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--其他配置省略-->
<!-- 配置統一異常處理handler -->
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>xxx.xxx.xxx.common.ext.RestExceptionHandler</param-value>
</context-param>
<!--其他配置省略-->
</web-app>
3.rest接口中拋出異常,即可被統一異常處理器處理
@GET
@Path("/{test}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String test(@PathParam("test") String test) throws Exception {
throw new Exception(test);
}
4.測試接口
測試定義的接口,路徑爲 /mklo , 可以看到如下結果,說明配置成功
{
"errorCode": "500",
"errorMessage": "mklo"
}