SpringBoot進級編--フォーム、AOP、異常

17243 ワード

一、フォーム検証
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());
    }
}