1.全局数据返回
可以定义一个hashmap类,结构类似下图这样,1.状态码,2.信息,3.数据域
工具类:
/**
* @Author: lzp
* @Description: 统一返回的工具类
* @Date Create in 13:26 2022/04/06
* @Modified By:
*/
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
//存元素 和setData的区别是 这个方法可以指定key的值
public R put(String key, Object value) {
super.put(key, value);
return this;
}
public R setData(Object data) {
put("data",data);
return this;
}
//远程调用服务时,另一个服务也会返回R类型的数据,这个方法可以获取key为data的value值
//利用fastjson进行反序列化
public <T> T getData(TypeReference<T> typeReference) {
Object data = get("data"); //默认是map
String jsonString = JSON.toJSONString(data);//转为json字符串
T t = JSON.parseObject(jsonString, typeReference);//转为对象
return t;
}
//利用fastjson进行反序列化
public <T> T getData(String key,TypeReference<T> typeReference) {
Object data = get(key); //默认是map
//转为json字符串
String jsonString = JSON.toJSONString(data);//转为json字符串
//转成需要的对象
T t = JSON.parseObject(jsonString, typeReference);//转为对象
return t;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
//无参构造
public R() {
put("code", 0);
put("msg", "success");
}
//返回错误码500的错误,错误内容:未知异常,请联系管理员
public static R error() {
return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
}
//返回错误码500的错误,错误内容需要自己传入
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;
}
//默认返回 0 success
public static R ok() {
return new R();
}
//获取code(状态码)的值
public Integer getCode() {
return (Integer) this.get("code");
}
}
使用:
1.return R.ok().setData(spuInfoEntity);
/**
* @Author: lzp
* @Description: 根据skuId查询spu的信息
* @Date Create in 13:43 2022/4/6
* @Param: skuId
* @Return: R
* @Modified By:
*/
@GetMapping(value = "/skuId/{skuId}")
public R getSpuInfoBySkuId(@PathVariable("skuId") Long skuId) {
SpuInfoEntity spuInfoEntity = spuInfoService.getSpuInfoBySkuId(skuId);
return R.ok().setData(spuInfoEntity);
}
返回数据
2.return R.ok().put(“page”, page); (可以自定义key)
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
PageUtils page = attrService.queryPage(params);
return R.ok().put("page", page);
}
返回数据:
2.全局异常处理
自定义异常类
/**
* @Author: lzp
* @Description:
* @Date Create in 13:56 2022/04/06
* @Modified By:
*/
public class PhoneException extends RuntimeException {
public PhoneException(String msg) {
super(msg);
}
}
不满足条件可以抛出异常
然后可以通过catch捕获异常 捕获到异常返回R.error()+自定义错误信息和错误码
全局异常
自定义全局异常处理器:
/**
* @Author: lzp
* @Description: 全局异常处理
* @Date Create in 14:05 2022/04/06
* @Modified By:
*/
@Slf4j
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.gulimallproduct.controller")//指定路径
public class GulimallExceptionControllerAdvice {
//加此注解捕获异常 异常类型:MethodArgumentNotValidException
@ExceptionHandler(value= MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e){
log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map<String,String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError)->{
errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
});
return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap);
}
//其他的异常由这个处理
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable){
log.error("错误:",throwable);
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
}
@Order(Ordered.HIGHEST_PRECEDENCE) 可以提高异常处理类的加载顺序
用这种方法就不需要catch来捕获异常了,业务中直接抛出即可,异常统一在这个类中处理
针对返回的错误信息,可以自定义一个枚举类,指定状态码和错误信息
/**
* @Author: lzp
* @Description: 枚举类 指定错误状态码和错误信息
* @Date Create in 14:55 2022/04/06
* @Modified By:
*/
public enum BizCodeEnume {
UNKNOW_EXCEPTION(10000,"系统未知异常"),
PRODUCT_UP_EXCEPTION(11000,"商品上架异常"),
TO_MANY_REQUEST(10002,"请求流量过大,请稍后再试"),
SMS_CODE_EXCEPTION(10002,"验证码获取频率太高,请稍后再试"),
USER_EXIST_EXCEPTION(15001,"存在相同的用户"),
PHONE_EXIST_EXCEPTION(15002,"存在相同的手机号"),
LOGINACCT_PASSWORD_EXCEPTION(15003,"账号或密码错误"),
NO_STOCK_EXCEPTION(21000,"商品库存不足"),
VAILD_EXCEPTION(10001,"参数格式校验失败");
private int code;
private String msg;
BizCodeEnume(int code, String msg){
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}