1. 表单验证
首先, 在实体类的需要验证的字段上添加添加验证注解, 验证注解类主要在 validation-api-1.1.0.Final.jar 的 javax.validation.constraints 包下, 以及 hibernate-validator-5.3.6.Final.jar 的 org.hibernate.validator.constraints 包下, 常用验证注解: @Min @Max @Length @Email 等.
public class User {
private Integer id;
private String name;
@Min(value=12,message="年龄不能小于12岁")
private Integer age;
然后, 在需要验证的参数前加 @Valid 注解, 使用 BindingResult 获取验证不通过的信息
@RestController
public class UserController {
@PostMapping("/addUser")
public void getUserList(@Valid User user, BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
// 打印出字段验证信息
System.out.println(bindingResult.getFieldError().getDefaultMessage());
System.out.println("BBBBBBBBB");
}
System.out.println("AAAAAAAAAAA");
}
}
2. AOP 统一处理请求
首先, 要引入 aop 相关 jar 包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
然后, 新建 aop 类
package com.codingos.springboot.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Component
public class HttpAspect {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
@Pointcut("execution(public * com.codingos.springboot.controller.UserController.*(..))")
public void log() {
}
/**
* 在被切入的方法执行之前执行
*/
@Before("log()")
public void doBefore(JoinPoint joinPoint) {
logger.info("***************** before aop 执行 ****************");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// url
logger.info("url={}", attributes.getRequest().getRequestURL());
// methond
logger.info("method={}", attributes.getRequest().getMethod());
// ip
logger.info("ip={}", attributes.getRequest().getRemoteAddr());
// 类方法
logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
// 参数
logger.info("args={}", joinPoint.getArgs());
}
/**
* 在被切入的方法执行之后执行
*/
@After("log()")
public void doAfter() {
logger.info("************************ after aop 执行 **************************");
}
/**
* 用来获取返回值
*/
@AfterReturning(returning = "object",pointcut = "log()")
public void doAfterReturning(Object object) {
logger.info("response={}", object.toString());
}
}
3. 统一返回格式
统一返回实体类
package com.codingos.springboot.common;
public class Result<T> {
private Integer code;// 正常成功为0,异常失败为1
private String message;
private T data;
public Result() {
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
返回工具类
public class ResultUtil<T> {
public static <T> Result<T> success(T object) {
Result<T> result = new Result<>();
result.setCode(0);
result.setMessage("成功");
result.setData(object);
return result;
}
public static <T> Result<T> success() {
Result<T> result = new Result<>();
result.setCode(0);
result.setMessage("成功");
return result;
}
public static <T> Result<T> error(Integer code, String message) {
Result<T> result = new Result<>();
result.setCode(code);
result.setMessage(message);
return result;
}
}
返回状态码 (错误码)
public enum ResultEnum {
EXCEPTION(-1,"未知异常"),
SUCCESS(0,"操作正常"),
ERROR(1,"发生错误");
private Integer code;
private String message;
private ResultEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
4. 统一异常处理
自定义异常
public class CustomException extends RuntimeException {
private static final long serialVersionUID = 7425266758852563283L;
private Integer code;
public CustomException(ResultEnum resultEnum) {
super(resultEnum.getMessage());
this.code = resultEnum.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
统一异常处理类 (异常往上抛 , 到controller 层也往外抛)
@ControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value=Exception.class)
@ResponseBody
public Result<Object> handle(Exception e) {
logger.error(ResultEnum.EXCEPTION.getMessage(), e);
return ResultUtil.result(ResultEnum.EXCEPTION, e.getMessage());
}
}
代码参考
可以到我的码云 https://gitee.com/jayking/spring-boot-learning 中的 spring-boot-web 目录下