spring boot表單驗證 及使用AOP處理
阿新 • • 發佈:2019-02-01
一、表單驗證
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 { @Idprivate 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);}}