Java Web 学习笔记之十一:RestEasy统一处理异常

前提

  • 利用JBoss restEasy框架搭建的restful java web后台应用
  • 希望通过统一的方式对restful接口抛出的异常进行处理封装

步骤

1.定义异常处理类

  • 异常处理类需要实现javax.ws.rs.ext.ExceptionMapper接口,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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中定义异常处理信息,如下图
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?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接口中抛出异常,即可被统一异常处理器处理

1
2
3
4
5
6
7
8
9
   @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 , 可以看到如下结果,说明配置成功

1
2
3
4
{
"errorCode": "500",
"errorMessage": "mklo"
}