发现问题
一般项目中都是将错误结果封装到统一返回结果®中。
例如
@PostMapping("/regist")
public R register(@RequestBody MemberRegisterVo vo) {
memberService.register(vo);
return R.ok();
}
统一返回结果R
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
//利用fastjson进行逆转,获取返回对象r中的数据
public <T> T getData(String key, TypeReference<T> typeReference) {
Object data = get(key);//默认是map
String s = JSON.toJSONString(data);
return JSON.parseObject(s, typeReference);
}
//利用fastjson进行逆转,获取返回对象r中的数据
public <T> T getData(TypeReference<T> typeReference) {
Object data = get("data");//默认是map
String s = JSON.toJSONString(data);
return JSON.parseObject(s, typeReference);
}
public R setData(Object data) {
put("data", data);
return this;
}
public R() {
put("code", 0);
put("msg", "success");
}
public static R error() {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
}
public static R error(String msg) {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
}
public static R error(int code, String msg) {
R r = new R();
r.put("code", code);
r.put("msg", msg);
return r;
}
public static R ok(String msg) {
R r = new R();
r.put("msg", msg);
return r;
}
public static R ok(Map<String, Object> map) {
R r = new R();
r.putAll(map);
return r;
}
public static R ok() {
return new R();
}
public R put(String key, Object value) {
super.put(key, value);
return this;
}
public Integer getCode() {
return (Integer) this.get("code");
}
}
但是如果调用memberService.register(vo)方法出错,controller层如何返回错误结果呢?这个方法是没有返回值的。
void register(MemberRegisterVo vo);
例如:如果在调用这个方法时,如何返回用户已经存在的消息
实现方法 – 异常机制
自定义异常通过继承RuntimeException
public class UserNameExistException extends RuntimeException {
public UserNameExistException() {
super("用户名已存在");
}
}
//检查用户名是否唯一
@Override
public void checkUserNameUnique(String username) throws UserNameExistException {
MemberDao memberDao = this.baseMapper;
Integer count = memberDao.selectCount(new QueryWrapper<MemberEntity>().eq("username", username));
if (count > 0) {
throw new UserNameExistException();
}
}
通过捕获异常获取错误消息
@PostMapping("/regist")
public R register(@RequestBody MemberRegisterVo vo) {
try {
memberService.register(vo);
} catch (PhoneExistException e) {
return R.error(BizCodeEnume.PHONE_EXIST_EXCEPTION.getCode(), BizCodeEnume.PHONE_EXIST_EXCEPTION.getMsg());
} catch (UserNameExistException e) {
return R.error(BizCodeEnume.USER_EXIST_EXCEPTION.getCode(), BizCodeEnume.USER_EXIST_EXCEPTION.getMsg());
}
return R.ok("注册成功");
}