一般我们的api接口最好统一返回一些错误码,使用Json封装错误码和相应的消息,我们可以使用一下的方式来实现异常的统一处理。
第一步:定义一个继承自RuntimeException的异常类,封装错误码和相应的消息。
public class ClientResponseException extends RuntimeException{
private int resultCode = ClientApiConstant.ResultCode.FAILED;
private Object data = null;
public ClientResponseException(int resultCode,String message,Object data){
super(message);
this.resultCode = resultCode;
this.data = data;
}
public ClientResponseException(String message){
super(message);
}
/**
* @return the resultCode
*/
public int getResultCode(){
return resultCode;
}
/**
* @param returnCode the resultCode to set
*/
public void setresultCode(int resultCode){
this.resultCode = resultCode;
}
/**
* @return the data
*/
public Object getData(){
return data;
}
/**
* @param data the data to set
*/
public void setData(Object data){
this.data = data;
}
}
第二步:在resources目录下建立ExceptionMapper的实现类,处理上面定义的异常,添加javax.ws.rs.ext.Provider注解,这样jersey就能自动发现该类。
@Provider
public class ExceptionMapperSupport implements ExceptionMapper<Exception>{
@Override
public Response toResponse(Exception exception){
exception.printStackTrace();
if(exception instanceof ClientResponseException){
ClientResponseException xx = (ClientResponseException)exception;
JSONObject object = new JSONObject();
object.put(ClientApiConstant.Key.RESULT_CODE, xx.getResultCode());
object.put(ClientApiConstant.Key.MESSAGE, xx.getMessage());
object.put(ClientApiConstant.Key.DATA,xx.getData());
return Response.ok(JSON.toJSONString(object, true), MediaType.APPLICATION_JSON).build();
}else {
JSONObject object = new JSONObject();
object.put(ClientApiConstant.Key.RESULT_CODE, ClientApiConstant.ResultCode.FAILED);
object.put(ClientApiConstant.Key.MESSAGE,ClientApiConstant.Msg.FAIL);
return Response.ok(JSON.toJSONString(object, true), MediaType.APPLICATION_JSON).build();
}
}
}
第三步:在resource方法中直接抛出上面定义的 ClientResponseException 异常
@POST
@Path("exception")
public String exception(){
//在需要抛出异常的时候
throw new ClientResponseException(1000,"messagge","额外数据");
}
返回的结果
{
"Message":"messagge",
"Data":"额外数据",
"ResultCode":1000
}