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;
org.springframework.boot
spring-boot-starter-aop
示例:
@Aspect
@Component
public class HttpAspect {
@Before("execution(public * com.imooc.controller.GirlController.girlList(..))")
public void log(){
System.out.println("11111111111");
}
}
@Before表示在方法执行之前,execution中确定绑定的方法,可用*号代替实际的方法名、类名等实现批量操作。
@After 表示在方法后执行
用于简化代码,示例:
@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");
}
用于处理执行后的返回值,示例:
@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);
}
@RunWith、@SpringBootTest、@Test
@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());
}
}
直接在测试类或测试方法上运行程序
在需要测试的类或方法上右键→GoTo→Test
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());
}
}
执行 mvn clean package命令,系统默认执行单元测试。
若想跳过单元测试进行打包,使用命令 mvn clean package -D maven.test.skip=true
这里有个问题,视频中 -D后面没有空格,不确定是什么原因导致不一样。