1. 程式人生 > >springboot實際專案:日誌列印、表單驗證、異常處理

springboot實際專案:日誌列印、表單驗證、異常處理

第一個比較系統的springboot的一個測試專案

涉及的知識有==日誌的列印==、==表單的驗證==、==異常的統一處理==

省略導包和getter、setter

日誌的列印:涉及AOP、Logger

@Aspect
@Component
public class HttpAspect {
    private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
    @Pointcut("execution(public * com.stefan.demo.controller.UserController.*(..))"
) public void log(){ } @Before("log()") public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request=attributes.getRequest(); //url logger.info("url={}"
,request.getRequestURI()); // /method logger.info("method={}",request.getMethod()); //ip logger.info("ip={}",request.getRemoteAddr()); //類方法 logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); //引數
logger.info("args={}", joinPoint.getArgs()); // System.out.println("前aop"); } @After("log()") public void doAfter(){ System.out.println("後aop"); } @AfterReturning(returning = "object",pointcut = "log()") public void doAfterReturning(Object object){ logger.info("response={}",object.toString()); } }

表單的驗證

第一步,先在實體類里加驗證註釋
  • @Size
  • @Min
  • @Max
  • @Pattern
    。。。。
@Table(name="t_user")
@Entity
public class user {
    @Id
    @GeneratedValue
    private Integer id;
    @Size(min = 2, max = 20, message = "姓名長度必須大於 2 且小於 20 字")
    private String name;
    private String password;
    @Min(value=18,message="年齡必須大於18歲")
    @Max(value=60,message = "年齡必須小於60歲")
    private Integer age;
    @Pattern(regexp = "(男)|(女)",message = "性別只能為男,女")
    private String sex;
    @Pattern(regexp="[0-9]{11}",message = "手機號為11位")
    private String phone;
    #省略getter、setter方法
}
第二步:在UserController裡相應方法形參里加@Valid
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
UserService us;
    @GetMapping("/save")
    public Result<user> save(@Valid   user user,BindingResult bindingResult){
        if (bindingResult.hasErrors()){
            return ResultUtil.error(bindingResult.getFieldError().getDefaultMessage());
        }
        return ResultUtil.success(us.addUser(user));
    }
}

異常統一處理(涉及到新建自定義異常類、管理錯誤編號、統一格式返回資訊)

統一的返回資訊樣式(save)

成功的:
{
    "code": 0,
    "msg": "成功",
    "data": {
        "id": 17,
        "name": "xxxxx",
        "password": null,
        "age": null,
        "sex": null,
        "phone": null
    }
}
失敗的:
{
    "code": 1,
    "msg": "姓名長度必須大於 2 且小於 20 字",
    "data": null
}

統一異常處理具體步驟

第一步:新建一個統一返回資訊的類
public class Result<T> {
    //錯誤碼
    private Integer code;
    //提示資訊
    private String msg;
    //具體的內容
    private T data;
    public Result() {
    }
    public Result(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}
第二步:新建一個統一管理異常編號的列舉類
public enum ResultEnum {
    UNKNOW_ERROR(-1,"未知錯誤"),
    SUCCESS(0, "成功"),
    ERROR(1,""),
    YOUNG(100,"你正處於職業發展期"),
    OLD(101,"你馬上就要退休了"),
    ;
    private  Integer code;
    private String msg;
    ResultEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public Integer getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}
第三步:新建一個處理返回資料的類(定義成功返回,失敗返回方法)
public class ResultUtil {
    public static Result success(Object object){
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMsg(ResultEnum.SUCCESS.getMsg());
        result.setData(object);
        return result;
    }
    public static Result success() {
        return success(null);
    }
    public static Result error(String msg) {
        Result result = new Result();
        result.setCode(ResultEnum.ERROR.getCode());
        result.setMsg(msg);
        return result;
    }
    public static  Result error(ResultEnum re){
        Result result = new Result();
        result.setCode(ResultEnum.UNKNOW_ERROR.getCode());
        result.setMsg(ResultEnum.UNKNOW_ERROR.getMsg());
        return result;
    }
}
第四步:自定義一個異常類(extends RuntimeException)
public class MyException extends RuntimeException {
    private Integer code;
    public MyException(ResultEnum re) {
        super(re.getMsg());
        this.code = re.getCode();
    }
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
}
第五步:新建一個處理剛才自定義異常的類
@ControllerAdvice
public class ExceptionHandle {
    private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handle(Exception e){
        if (e instanceof MyException){
            MyException myException=(MyException) e;
            return ResultUtil.error(e.getMessage());
        }else{
            logger.error("【系統異常】{}", e);
            return ResultUtil.error(ResultEnum.UNKNOW_ERROR);

        }
    }
}

這個springboot專案還是十分簡陋的,筆者也在學習當中,關於springboot的實戰知識會不斷更新,希望能夠跟外界有個很好的交流。