【SpringBoot】web进阶——表单验证,AOP统一处理请求日志,统一异常处理,单元测试

表单验证

 
  
@valid 注解应用 1 在实体类添加限制条件的注解 并标明返回message
                           2 在 请求参数前添加 @valid 注解
@Valid-检验,结果返回到BindingResult对象中
public void **(@Valid Girl girl,BindingResult bindingResult){
	if(bindingResult.hasErrors()){
		String errmessage = bindingResult.getFieldError().getDefaultMessage();
	}
	...
}

class Girl(){
	@Min(value=18,message="***")
	Integer age;
}
关于建包之后出现404错误,有可能是建包的位置不对,建包的文位置应该跟入口启动文件为同一级


AOP统一处理请求日志

 
  
AOP(面向切面编程)是一种范式,并不是只有在java中才会出现,   .net C# C艹 中都有实现AOP思想
OOP(面向对象)
首先,需要在pom中引入aop的包
 
            org.springframework.boot
            spring-boot-starter-aop
        

然后建立一个类,用
@Aspect
@Component
做注解


然后,在类中需要统一处理的方法,并用@before注释一下需要应用切面的包或者类或者方法
 @Before("execution(public * com.quanxian.quanxian.controller.UserController.*(..))")
    public void log()
    {
        System.out.println("111111");
    }
通过logger日志来打印控制台信息。logger.info();会打印日志的相关信息。线程号,端口,包名,时间。
@Aspect
@Component
public class HttpAspect {
    private final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);

    @Pointcut("execution(public * com.example.project.web.CustomerContorller.*(..))")
    public void log(){
    }
    @Before("log()")
    public void doBefore(){
        logger.info("aaaa");

    }
    @After("log()")
    public void doAfter(){
        logger.info("bbbb");
    }

}
【aop中获取HttpRequest请求数据:】
//url
//method
//ip
//类方法-使用joinPoint对象取
//参数

【aop中获取方法返回内容】
@AfterReturning(pointcut=***)
public void do_log(Object obj){
    //{}为占位
    log.info("return={}",obj.toString())
}


统一异常处理

统一异常处理。现在的前端和后端都是分离的,返回的大多数都是json格式的。如果发生异常最好也转化为json格式发送给前端。所以我们必须对抛出去的异常进行统一的格式处理。
第一步:@controlleradvice (异常捕获之前的注解)

第二步:在方法前面加注解 @ExceptionHandler
spring只会针对RuntimeException进行回滚,而不会对Exception进行回滚
分两种异常------系统异常和自定义异常,通过instanceof判断异常类。
异常情况统一管理,建立枚举类,提高内聚性,逻辑在一个地方处理,为后续更改提供便利。public enum ResultEnum{  ...  }
 
  

单元测试

--Service 测试
@RunWith(SpringRunner.class)-表示在测试环境
@SpringBootTest-表示将启动整个spring工程 这两个是类之上加的注解
public class GirkServiceTest{
	@Autowired
	provate GirlService gservice;
	
	@Test 这个是方法上加的注解
	public void findOneTest(){
	    Girl girl = gservice.findOne(73);
		//断言,判断是否正确,测试service通过与否
		Assert.assertEquals(new Integer(14),girl.getAge());
	}
}

--Controller 测试 对API的一个测试
@RunWith(SpringRunner.class) 表示要在测试环境下跑
@SpringBootTest 表示将启动整个spring工程
@AutoConfigureMockMvc //add
public class GirlControllerTest{
  @Autowired
  private MockMvc mvc;
  
  @Test
  public void girlList()throws Exception{
    mvc.perform(MockMvcRequestBuilders.get("/girls"))
	  //判断请求返回码为200
	  .andExpect(MockMvcResultMatchers.status().isOk())
	  //判断返回的内容为abc
	  .andExpect(MockMvcResultMatchers.content().string("abc"))
  }

  mvn clean packet -- 命令打包时会自动进行单元测试并返回 结果
  mvn clean packet -Dmaven.test.skip=true -- 表示打包时跳过单元测试

}

你可能感兴趣的:(Intellij,IDEA,Java,SpringBoot,Intellij,IDEA,Java,SpringBoot)