一、使用@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