springboot實際專案:日誌列印、表單驗證、異常處理
阿新 • • 發佈:2019-02-15
第一個比較系統的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);
}
}
}