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; }
前台请求的地址为
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(通用的方法抽取出来)
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("++++++++++++++++++++++++++++"); } }效果
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); }}