Spring Boot 表单验证、AOP统一处理请求日志、单元测试

 一、使用@Valid表单验证 

于实体类中添加@Min等注解

 1 @Entity
 2 public class Girl {
 3 
 4     @Id
 5     @GeneratedValue
 6     private Integer id;
 7 
 8     private String cupSize;
 9     @Min(value = 18,message = "未成年禁止入内!")
10     private Integer age;
11 ...
12 }

 给指定的访问方法参数添加@Valid 注解,并使用BindingResult bindingResult对象获取返回结果

 1 @PostMapping(value = "/girls")
 2     public Girl addgirl(@Valid Girl girl, BindingResult bindingResult){
 3         if (bindingResult.hasErrors()){
 4             System.out.println(bindingResult.getFieldError().getDefaultMessage());
 5             return null;
 6         }
 7         girl.setCupSize(girl.getCupSize());
 8         girl.setAge(girl.getAge());
 9         return girlRepository.save(girl);
10     }

二、使用AOP处理请求

使用AOP统一处理请求日志

在pom文件中添加aop依赖,

<!-- aop依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

新建aspect类:

 1 @Aspect
 2 @Component
 3 public class HttpAspect {
 4 
 5     @Pointcut("execution(public * com.cenobitor.controller.GirlController.girlList(..))")
 6     public void log(){
 7     }
 8 
 9     @Before("log()")
10     public void doBefore(){
11         System.out.println(11111111);
12     }
13 
14     @After("log()")
15     public void doAfter(){
16         System.out.println(22222222);
17     }
18 
19 }

 1 /*
 2 * 以日志的形式取代sout,显示更详细的信息
 3 * */
 4 @Aspect
 5 @Component
 6 public class HttpAspect {
 7     //import org.slf4j.Logger;
 8     private final static Logger LOGGER = LoggerFactory.getLogger(HttpAspect.class);
 9     //设置切点,简化代码
10     @Pointcut("execution(public * com.cenobitor.controller.GirlController.girlList(..))")
11     public void log(){
12     }
13     
14     //获取请求信息
15     @Before("log()")
16     public void doBefore(JoinPoint joinPoint){
17 
18         ServletRequestAttributes  attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
19         HttpServletRequest request = attributes.getRequest();
20 
21         //URL
22         LOGGER.info("url={}",request.getRequestURL());
23         //IP
24         LOGGER.info("ip={}",request.getRemoteAddr());
25         //METHOD
26         LOGGER.info("method={}",request.getMethod());
27         //类方法
28         LOGGER.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
29         //参数
30         LOGGER.info("args={}",joinPoint.getArgs());
31 
32     }
33 
34     @After("log()")
35     public void doAfter(){
36         LOGGER.info("222222222222");
37     }
38     //打印返回结果
39     @AfterReturning(returning = "object",pointcut = "log()")
40     public void doAfterReturning(Object object){
41         LOGGER.info("response={}",object.toString());
42     }
43 }

三、单元测试

  • 基本代码:
 1 @RestController
 2 public class CustomerController {
 3     @Autowired
 4     private CustomerService customerService;
 5 
 6     @GetMapping(value = "customer_findById")
 7     public Customer findById(@RequestParam("id") Integer id){
 8         return customerService.findById(id);
 9     }
10 }vv
 1 @Service
 2 @Transactional
 3 public class CustomerServiceImpl implements CustomerService {
 4     @Autowired
 5     private CustomerRepository customerRepository;
 6 
 7     @Override
 8     public Customer findById(Integer id) {
 9         return customerRepository.findOne(id);
10     }
11 }
  • service层测试
 1 @RunWith(SpringRunner.class)
 2 @SpringBootTest
 3 public class CustomerServiceTest {
 4     @Autowired
 5     private CustomerService customerService;
 6 
 7     @Test
 8     public void findByIdTest(){
 9         Customer customer = customerService.findById(1);
10         Assert.assertEquals("张三",customer.getName());
11 
12     }
13 }
  • API测试(即controller层测试):
 1 @RunWith(SpringRunner.class)
 2 @SpringBootTest
 3 @AutoConfigureMockMvc
 4 public class CustomerControllerTest {
 5     @Autowired
 6     private MockMvc mvc;
 7 
 8     @Test
 9     public void findById() throws Exception {
10         mvc.perform(MockMvcRequestBuilders.get("/customer_findById?id=1"))
11                 .andExpect(MockMvcResultMatchers.status().isOk())
12                 .andExpect(MockMvcResultMatchers.content().string("abc"));//返回结果
13     }
14 }
  • 常用命令:
    • 执行打包并进行单元测试

mvn clean package

    • 执行打包并跳过所有单元测试

mvn clean package -Dmaven.test.skip=true

原文地址:https://www.cnblogs.com/gdwkong/p/8639045.html