spring boot表单验证 及使用AOP处理

一、表单验证

1、当前台传入的参数过多是可以用一个对象来对属性进行接收

@PostMapping(value="/girl")
public Girl addGirl( Girl girl){
   girl.setAge(girl.getAge());
    girl.setCupSize(girl.getCupSize());
    girl.setId(girl.getId());
    Girl save = girlRepository.save(girl);
    return save;
}

前台请求的地址为

spring boot表单验证 及使用AOP处理

2、对对象中的一个属性进行验证

实体类中注解如下:

@Entity
public class Girl {
    @Id
    private Integer id;
    private String cupSize;
    @Min(value =18,message = "未成年少女禁止入内")
    private Integer age;}

controller层如下处理:@Valid, 校验的结果会放在BindingResult 中

@PostMapping(value="/girl")
public Girl addGirl(@Valid Girl girl, BindingResult bindingResult){
    if (bindingResult.hasErrors()){
        System.out.println(bindingResult.getFieldError().getDefaultMessage());
        return null;
    }
   girl.setAge(girl.getAge());
    girl.setCupSize(girl.getCupSize());
    girl.setId(girl.getId());
    Girl save = girlRepository.save(girl);
    return save;
}

二、AOP(通用的方法抽取出来)

spring boot表单验证 及使用AOP处理

spring boot表单验证 及使用AOP处理

1、添加依赖POM

<!--AOP-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
   <optional>true</optional>
</dependency>

2、写通用的Aspect类

里面两个.表示所有的方法里面所有的参数都会拦截

拦截controller里面的所有方法  方法名改为*即可

execution(public * com.springboot.controller.GirlController.girlList(..))

@Aspect
@Component
public class aspect {//
    @Before("execution(public * com.springboot.controller.GirlController.girlList(..))")
    public void log(){
    System.out.println("++++++++++++++++++++++++++++");
    }
}
效果

spring boot表单验证 及使用AOP处理

3、切面

没有切面的话,添加before和after方法需要如下所示

@Aspect
@Component
public class aspect {//里面两个.表示所有的方法里面所有的参数都会拦截
    @Before("execution(public * com.springboot.controller.GirlController.*(..))")
    public void log(){
    System.out.println("++++++++++++++++++++++++++++");
    }
    @After("execution(public * com.springboot.controller.GirlController.*(..))")
    public void log2(){
        System.out.println("---------------------------");
    }
}

显而易见代码重复,加入切面的话(切面就是要增强的方法)

@Aspect
@Component
public class aspect {//里面两个.表示所有的方法里面所有的参数都会拦截
    @Pointcut("execution(public * com.springboot.controller.GirlController.*(..))")
    public void log(){
    }
    @After("log()")
    public void log1(){
        System.out.println("---------------------------");
    }
    @Before("log()")
    public void log2(){
        System.out.println("+++++++++++++++++++++++++++");
    }
}

加入打印日志

@Aspect
@Component
public class HttpAspect {//里面两个.表示所有的方法里面所有的参数都会拦截

     private  final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);
    @Pointcut("execution(public * com.springboot.controller.GirlController.*(..))")
    public void log(){
    }
    @After("log()")
    public void log1(){
        logger.info("++++++++++++++++++++");
    }
    @Before("log()")
    public void log2(){
        logger.info("--------------------");
    }
}

加入打印的请求信息以及返回的对象信息

ServletRequestAttributes servletRequestAttributes= 

(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();

       HttpServletRequest request= servletRequestAttributes.getRequest();

 @AfterReturning(returning = "object",pointcut = "log()")

@Aspect
@Component
public class HttpAspect {//里面两个.表示所有的方法里面所有的参数都会拦截

     private  final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);
    @Pointcut("execution(public * com.springboot.controller.GirlController.*(..))")
    public void log(){
    }
    @After("log()")
    public void log1(){
       ServletRequestAttributes servletRequestAttributes= (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
       HttpServletRequest request= servletRequestAttributes.getRequest();
        //url
        logger.info("url={}",request.getRequestURI());
        //method
        logger.info("method={}",request.getMethod());
        //ip
        logger.info("ip={}",request.getRemoteAddr());
    }
    @Before("log()")
    public void log2(){
        logger.info("--------------------");
    }
    //打印返回的参数
    @AfterReturning(returning = "object",pointcut = "log()")
//returnnig参数就是我们的入参
 public void doAfterReturing(Object object){
logger.info("response={}",object); }}