Spring Boot 学习 Web进阶

一、valid验证

    controller中对变量使用@Valid注解,同时使用BindingResult获取验证结果,使用示例:

@PostMapping(value = "/girls")
    public  Girl girlAdd(@Valid Girl girl, BindingResult bindingResult){
       /* Girl girl = new Girl();
        girl.setCupSize(cupSize);
        girl.setAge(age);*/

       if(bindingResult.hasErrors()){
           System.out.println(bindingResult.getFieldError().getDefaultMessage());
           return null;
       }

        return girlRepository.save(girl);
    }

在实体类中使用注解进行对字段进行约束,示例验证最小18岁:

@Min(value = 18,message = "未满18岁禁止入内")
    private Integer age;

二、AOP的使用

1、POM添加


			org.springframework.boot
			spring-boot-starter-aop
		

2、添加一个带@Aspect注解的类

示例:

@Aspect
@Component
public class HttpAspect {

    @Before("execution(public * com.imooc.controller.GirlController.girlList(..))")
    public void log(){
        System.out.println("11111111111");
    }
}

@Before表示在方法执行之前,execution中确定绑定的方法,可用*号代替实际的方法名、类名等实现批量操作。

@After 表示在方法后执行

3、@PointCut使用

    用于简化代码,示例:

@Pointcut("execution(public * com.imooc.controller.*.*(..))")
    public void log(){
    }

    @Before("log()")
    public void doBefore(){
        System.out.println("11111111111");
    }

    @After("log()")
    public void doAfter(){
        System.out.println("22222222222");
    }

4、@AfterReturning 使用

    用于处理执行后的返回值,示例:

@AfterReturning(returning = "object",pointcut = "log()")
    public void doAfterReturning(Object object){
        logger.info("returning={}",object.toString());
    }

三、异常处理

1、统一异常捕获

示例代码:

@ControllerAdvice
public class ExceptionHandle {

    public final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handle(Exception e){

        if(e instanceof GirlException){
            GirlException girlException = (GirlException) e;
            return ResultUtils.error(girlException.getCode(),girlException.getMessage());
        }else{
            logger.error(" [系统异常] {}",e);

            return ResultUtils.error(-1,"未知错误");
        }
    }
}

这里使用了@ControllerAdvice、@ExceptionHandle、@ResponseBody三个注解

service示例代码:

public void getAge(Integer id) throws Exception{
        Girl girl = girlRepository.findById(id).get();
        if(girl.getAge() < 12)
            throw new GirlException(100,"你还在上小学吧!");
        else if(girl.getAge() >=12 && girl.getAge() < 18)
            throw new GirlException(101,"你还在上中学吧!");
        else
            throw new GirlException(0,"你已经成年了!");
    }

controller示例代码:

@GetMapping(value = "/girls/age/{id}")
    public void getAge(@PathVariable("id") Integer id) throws Exception{
        girlService.getAge(id);
    }

四、单元测试

1、使用的注解

@RunWith、@SpringBootTest、@Test

2、Servcie测试示例代码

@RunWith(SpringRunner.class)
@SpringBootTest
public class GirlServiceTest {

    @Autowired
    private GirlService girlService;

    @Test
    public void findByAgeTest(){
        Girl girl = girlService.findByAge(13);

        Assert.assertEquals(new Integer(14),girl.getAge());
    }
}

3、启动测试方式

直接在测试类或测试方法上运行程序

4、IDEA快速创建单元测试方法

在需要测试的类或方法上右键→GoTo→Test

Spring Boot 学习 Web进阶_第1张图片

5、针对Controller进行测试

controller的测试与其他方法不同,除了判断方法执行是否成功外,还需要判断url访问是否正常,这里就需要使用到另外一个注解:@AutoConfigureMockMvc。

具体示例代码:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class GirlControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void girlList() throws Exception{
        mvc.perform(MockMvcRequestBuilders.get("/girls")).andExpect(MockMvcResultMatchers.status().isOk());
    }
}

6、结合maven的单元测试

执行 mvn clean package命令,系统默认执行单元测试。

若想跳过单元测试进行打包,使用命令  mvn clean package -D maven.test.skip=true

这里有个问题,视频中 -D后面没有空格,不确定是什么原因导致不一样。

你可能感兴趣的:(Spring,Boot)