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或者xml
public 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的’处理器’,如下:
@Provider
public 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.youkuaiyun.com/u012706811/article/details/52054157
资源实例下载:http://download.youkuaiyun.com/detail/sotong006/9913077
952



被折叠的 条评论
为什么被折叠?



