SpringBoot進級編--フォーム、AOP、異常
一、フォーム検証
1、エンティティークラスでフィルタする条件を設定する
2、コントローラに戻ってきた我々がフィルタした結果
二、AOP処理要求
AOP:フェースプログラミング向け
1、依存を追加
2、遮断器を書く
三、統一異常処理
1、例外クラスをカスタマイズする
PersonException.java
2、異常遮断器の作成
ExceptionHandle.java
3、結果セットパッケージ
Result.java
ResultUtil.java
4、使用
サービス・レベルでのテスト
四、ユニットテスト
リクエストurlインタフェースのテスト
1、エンティティークラスでフィルタする条件を設定する
@Min(value = 18,message = " !")
private int userage;
2、コントローラに戻ってきた我々がフィルタした結果
/**
* POST
* @param user
* @return
*/
@PostMapping(value = "adduser")
public User addUser(@Valid User user, BindingResult bindingResult){
//
if (bindingResult.hasErrors()){
//
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return null;
}
userRespository.save(user);
return user;
}
二、AOP処理要求
AOP:フェースプログラミング向け
1、依存を追加
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
dependency>
2、遮断器を書く
graph LR
Before-->
-->After
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
*
*
* @author MiChong
* @Email [email protected]
* @create 2018/2/22 0022
* @Version:V1.0
*/
@Aspect
@Component
public class HttpAspect {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
/**
* log() , ,
*/
@Pointcut("execution(public * cn.buildworld.girl.web..*(..))")
public void log(){
}
/**
* ,
* @param joinPoint
*/
@Before("log()")
public void before(JoinPoint joinPoint){
logger.info("before ");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//url
logger.info("url={}",request.getRequestURL());
//method
logger.info("method={}",request.getMethod());
//ip
logger.info("ip={}",request.getRemoteAddr());
//
logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
//
logger.info("args={}",joinPoint.getArgs());
}
/**
* ,
*/
@After("log()")
public void after(){
logger.info("after ");
}
/**
*
* @param object
*/
@AfterReturning(returning = "object",pointcut = "log()")
public void doAfterReturning(Object object){
logger.info("response={}",object);
}
}
三、統一異常処理
1、例外クラスをカスタマイズする
PersonException.java
/**
*
*
* @author MiChong
* @Email [email protected]
* @create 2018/2/22 0022
* @Version:V1.0
*/
public class PersonException extends RuntimeException {
private Integer code;
/**
* @param message
* @param code
*/
public PersonException(String message, Integer code) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
2、異常遮断器の作成
ExceptionHandle.java
import cn.buildworld.girl.pojo.Result;
import cn.buildworld.girl.pojo.ResultUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Create by MiChong on 2018/2/22 0022
*
* @Email [email protected]
*
*
*/
@ControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e){
//
if(e instanceof PersonException){
PersonException personException = (PersonException) e;
return ResultUtil.error(personException.getCode(),personException.getMessage());
}
return ResultUtil.error(-1,e.getMessage());
}
}
3、結果セットパッケージ
Result.java
package cn.buildworld.girl.pojo;
/**
* json
*
* @author MiChong
* @Email 1564666023@qq.com
* @create 2018/2/22 0022
* @Version:V1.0
*/
public class Result<T> {
/**
*
*/
private Integer code;
/**
*
*/
private String msg;
/**
*
*/
private T data;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
ResultUtil.java
package cn.buildworld.girl.pojo;
/**
*
*
* @author MiChong
* @Email [email protected]
* @create 2018/2/22 0022
* @Version:V1.0
*/
public class ResultUtil {
/**
*
* @param object
* @return
*/
public static Result success(Integer code,Object object){
Result result = new Result();
result.setCode(code);
result.setMsg(" ");
result.setData(object);
return result;
}
/**
*
* @param object
* @return
*/
public static Result error(Integer code,Object object){
Result result = new Result();
result.setCode(code);
result.setMsg(" ");
result.setData(object);
return result;
}
}
4、使用
サービス・レベルでのテスト
public void getAge(Long id) throws Exception{
User one = userRespository.findOne(id);
if(one.getUserage() < 10){
throw new PersonException(" ", 100);
}
}
四、ユニットテスト
リクエストurlインタフェースのテスト
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import javax.swing.*;
import static org.junit.Assert.*;
/**
* Create by MiChong on 2018/2/22 0022
*
* @Email [email protected]
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class PersonControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void getInfo() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/demo/getInfo"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}