1. 程式人生 > >spring boot表單驗證 及使用AOP處理

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);}}