SpringBoot进阶之Web进阶

本文深入探讨了SpringBoot的Web进阶应用,包括表单验证、AOP请求日志处理、统一异常处理和单元测试。在表单验证中,详细介绍了如何使用注解进行数据校验。在AOP部分,解释了AOP概念,并展示了如何记录HTTP请求日志。接着,文章阐述了如何实现全局异常处理。最后,通过多个示例说明了如何进行单元测试,确保代码质量。
摘要由CSDN通过智能技术生成

一.表单验证

1.为要校验的对象添加对应的校验注解
  • 使用@Min(value=18,message="未成年少女金之入内")标记对应类中的属性。注解表示age最小值为18,错误提示为:未成年少女禁止入内

  • Girl类实例代码

    package com.study.demo.domain;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.validation.constraints.Min;
    
    @Entity
    public class Girl{
          
        @Id
        @GeneratedValue
        private Integer id;
        private String cupSize;
    
        //表示age最小值为18,错误提示为:未成年少女禁止入内
        @Min(value=18,message = "未成年少女禁止入内")
        private Integer age;
    
        public Integer getId() {
          
            return id;
        }
    
        public void setId(Integer id) {
          
            this.id = id;
        }
    
        public String getCupSize() {
          
            return cupSize;
        }
    
        public void setCupSize(String cupSize) {
          
            this.cupSize = cupSize;
        }
    
        public Integer getAge() {
          
            return age;
        }
    
        public void setAge(Integer age) {
          
            this.age = age;
        }
    
        @Override
        public String toString() {
          
            return "Girl{" +
                    "id=" + id +
                    ", cupSize='" + cupSize + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
2.在对应方法的入参中使用@Vaild注解标记该对应需要被验证,并通过BindingResult类型参数接受验证结果
  • 结果对象的hasErrors()方法用于判断是否发生错误

  • 结果对象的getFieldError().getDefaultMessage()方法获得对应的错误信息

  • 对应方法的实例代码

    //新增女生
    @PostMapping(value="/girls")
    public Girl girlAdd(@Valid Girl girl, BindingResult bindingResult){
          //@Valid注解表示要验证的对象为girl,验证结果会返回到参数bindingResult对象中
        //通过对象的hasErrors()方法获得是否发生错误
        if(bindingResult.hasErrors()){
          
            //并通过getFieldError().getDefaultMessage()方法获得对应的错误信息
            System.out.println(bindingResult.getFieldError().getDefaultMessage());
            return null;
        }
        girl.setCupSize(girl.getCupSize());
        girl.setAge(girl.getAge());
        return girlRepository.save(girl);//方法返回的就是添加的对象
    }
    
  • 当发送post请求时,若cupSize属性超过18则会在控制台输出“未成年少女禁止入内”,并返回null值

二.AOP统一处理请求日志

1.什么是AOP?
  • AOP是一种编程范式,与语言无关,是一种程序设计思想
  • 面向切面(AOP)Aspect Oriented Programming:将通用逻辑从业务逻辑中分离出来
  • 面向对象(OOP)Object Oriented Programming
  • 面向过程(POP)Procedure Oriented Programming
2.网络请求的生命周期

收到HttpRequest请求 —> 记录请求 —> 处理网络请求 —> 生成HttpResponse —> 记录回复

3.操作数据库的生命周期

收到数据库操作请求 —> 记录请求 —> 增删改查 —> 生成处理结果 —> 记录回复

4.记录每一个http请求
  • 添加依赖

    <dependency>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
  • 建立处理文件:aspect/HttpAspect.java

    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    @Aspect//标记类为Aspect类
    @Component//引入到Spring容器中
    public class HttpAspect {
          
    
        //org.slf4j.Logger是Spring自带的日志记录框架
        private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
    
        @Pointcut("execution(public * com.study.demo.controller.HelloController.girlList(..))")//.girlList(..)表示girlList方法不管是任何参数都会被拦截;.*(..)则表示该类的所有方法都会被拦截
        public void log(){
          
    
        }
    
        //定义在http请求到方法之前将内容记录下来
        @Before("log()")
        public void doBefore(){
          
            logger.info("记录日志");//使用Logger的方法记录日志
        }
    
        //定义在执行完方法后调用
        @After("log()")
        public void doAfter(){
          
            logger.info("执行方法之后的调用...");
        }
    }
    
  • 访问接口时的显示内容(可以看出使用logger.info()方法打印的内容带有时间等相关信息)

    2018-09-19 12:58:55.250  INFO 44464 --- [nio-8082-exec-2] com.study.demo.aspect.HttpAspect         : 记录日志
    2018-09-19 12:58:55.253  INFO 44464 --- [nio-8082-exec-2] c.study.demo.controller.HelloController  : 执行到GirlList
    2018-09-19 12:58:55.280  INFO 44464 --- [nio-8082-exec-2] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
    Hibernate: select girl0_.id as id1_0_, girl0_.age as age2_0_, girl0_.cup_size as cup_size3_0_ from girl girl0_
    2018-09-19 12:58:55.364  INFO 44464 --- [nio-8082-exec-2] com.study.demo.aspect.HttpAspect         : 执行方法之后的调用...
    
  • 调整@Before注解的方法执行指定内容

    @Before("log()")
    public void doBefore(JoinPoint joinPoint){
          
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest(</
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值