Jersey全局异常处理器

来源:互联网 发布:伊美服饰淘宝网 编辑:程序博客网 时间:2024/05/29 08:21
全局异常处理器


webservice定义全局返回错误码,是很重要的一个功能,jersey正好就能实现这一功能.


整个流程就是当jersey托管的类发现了异常,
抛出给jersey的异常处理器,
该异常处理器直接返回自定义的错误代码.


1.定义异常代码


可以使用枚举类,也可以写到配置文件中,再写个工具类获取.看项目需求了.

public enum ErrorCode {    OK(0,"OK"),ID_INVALID(1,"ID is invalid"),OTHER_ERR(2,"未知错误");    private int code;    private String message;    ErrorCode(int code, String message) {        this.code = code;        this.message = message;    }    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }}

2.定义出现异常将返回的实体代理


也就是封装异常信息到这个类中,再转换为json串返回,如果自己直接构造字串也是可以代替的

@XmlRootElement//标识该资源可以被jersey转为json或者xmlpublic class ErrorEntity {    private int resp_code;    private String resp_msg;    public ErrorEntity(int resp_code, String resp_msg) {        this.resp_code = resp_code;        this.resp_msg = resp_msg;    }    public ErrorEntity() {    }    public int getResp_code() {        return resp_code;    }    public void setResp_code(int resp_code) {        this.resp_code = resp_code;    }    public String getResp_msg() {        return resp_msg;    }    public void setResp_msg(String resp_msg) {        this.resp_msg = resp_msg;    }}

3.自定义异常


自定义异常,处理时拦截该指定异常

public class DeviceException extends Exception {    private int code;    private String message;    /**     * 构造异常类     * @param code     * @param message     */    public DeviceException( int code,String message) {        this.code = code;        this.message = message;    }    /**     * 根据枚举类构造异常结果     * @param errorCode     */    public DeviceException(ErrorCode errorCode) {        this.code = errorCode.getCode();        this.message = errorCode.getMessage();    }    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }    @Override    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }}
4.定义jersey异常处理器


异常处理器要实现ExceptionMapper<Exception>接口,并复写返回方法,另外一定要使用@Provider标识该类为一个jersey的’处理器’,如下:

@Providerpublic class DeviceExceptionMapper implements ExceptionMapper<Exception> {    @Override    public Response toResponse(Exception e) {        Response.ResponseBuilder ResponseBuilder = null;        if (e instanceof DeviceException){            //截取自定义类型            DeviceException exp = (DeviceException) e;            ErrorEntity entity = new ErrorEntity(exp.getCode(),exp.getMessage());            ResponseBuilder = Response.ok(entity, MediaType.APPLICATION_JSON);        }else {            ErrorEntity entity = new ErrorEntity(ErrorCode.OTHER_ERR.getCode(),e.getMessage());            ResponseBuilder = Response.ok(entity, MediaType.APPLICATION_JSON);        }        System.out.println("执行自定义异常");        return ResponseBuilder.build();    }}

5.注册该异常


在RESTApplication中要加载该异常,可以使用package扫包,或者直接注册异常都是可以的.


public class RESTApplication extends ResourceConfig {    public RESTApplication() {        //想让jersey托管的部分需要加入扫描,或者使用register指定托管类也可以        packages("com.haikong.resources","com.haikong.exception");        //加载日志包        register(LoggingFilter.class);        //加载json转换器        register(JacksonJsonProvider.class);        System.out.println("加载RESTApplication");    }}

6.测试

/**  * 测试全局异常托管  * @throws DeviceException  */  @GET  @Path("/testexception")  public void testException() throws DeviceException {if (true){    throw new DeviceException(ErrorCode.OTHER_ERR);}  }


7.返回结果

{"resp_code": 2,"resp_msg": "未知错误"}

转自:http://blog.csdn.net/u012706811/article/details/52054157

资源实例下载:http://download.csdn.net/detail/sotong006/9913077