最近在写一个小项目,突然想到可以自定义一个异常来处理用户未找到的情况,并且返回相应的状态码和信息。所以我翻了一下我以前学习SpringBoot时的笔记,稍微写了一下。
首先写一个自定义状态码枚举
package top.codekiller.manager.common.exception;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
/**
* @author codekiller
* @date 2020/5/30 12:33
*
* 自定义状态码
*/
@AllArgsConstructor
@NoArgsConstructor
public enum ApiExceptionCode {
/**
* 找不到用户
*/
USER_NOT_FOUND(444,"USER NOT FOUNED");
/**
* 状态码
*/
private Integer value;
/**
* 描述信息
*/
private String desc;
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
定义一个父类异常,继承自RuntimeException
package top.codekiller.manager.common.exception;
import lombok.Data;
/**
* @author codekiller
* @date 2020/5/30 12:41
* 自定义异常父类
*/
@Data
public class ApiException extends RuntimeException {
private static final long serialVersionUID=8088897180748768529L;
private Integer code;
public ApiException(Integer code,String msg){
super(msg);
this.code=code;
}
}
创建自定义子类异常
package top.codekiller.manager.user.exception;
import top.codekiller.manager.common.exception.ApiException;
import top.codekiller.manager.common.exception.ApiExceptionCode;
/**
* @author codekiller
* @date 2020/5/30 12:47
* 自定义用户未找到异常
*/
@SuppressWarnings("all")
public class UserNotFoundException extends ApiException {
private static final long serialVersionUID=8088898180748728529L;
public UserNotFoundException(String msg){
super(ApiExceptionCode.USER_NOT_FOUND.getValue(),msg);
}
}
注意这里不能将异常类交给Spring的容器进行管理,因为异常时需要我们手动创建实例化的
以上异常的创建基本完成了,接下来实现对异常的处理
@RestControllerAdvice
@Slf4j
public class BadRequestExceptionHandler {
/**
* 用户未找到异常处理
* @param e
* @return
*/
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity userNotFoundExceptionHandler(UserNotFoundException e){
log.error(e.getMessage(),e);
return ResponseEntity.ok(ControllerUtils.getPublicBackValue(e.getCode(),e.getMessage()));
}
}
这里的getPublicBackValue是我封装的一个用于相应的工具方法
/**
* 用于controller的工具类
* @author codekiller
* @date 2020/5/20 23:30
*/
public class ControllerUtils {
public static Map<String, Object> getPublicBackValue(Integer code, String message) {
Map<String, Object> map = new HashMap<String, Object>(3);
map.put("result_code",code);
map.put("result_reason", message);
return map;
}
}
测试
/**
* 修改用户的状态
* @param id
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void updateStatusById(Long id) {
User user=this.userMapper.selectById(id);
if(user==null){
throw new UserNotFoundException("用户未找到");
}
user.setStatus(!user.getStatus());
this.userMapper.updateById(user);
//更新缓存
String key="user:info:"+user.getId();
if(this.redisTemplate.hasKey(key)){
this.redisTemplate.opsForValue().set(key,user);
}
}
这里抛出了异常
后台的日志输出
前台获取的响应信息