zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用python打印九九乘法表
    python导入库的几种方式
    节点的介数
    连通图、强连通图、弱连通图
    python的基本格式化输出
    pycharm中的py文件重命名
    设置pycharm,在python程序的开头添加时间和作者等信息
    使用pandas库对csv文件进行筛选和保存
    python获取Excel表中某一格的数据
    使用python向txt文件写入内容
  • 原文地址:https://www.cnblogs.com/gdwkong/p/8639045.html
Copyright © 2011-2022 走看看