SpringBoot进阶篇--表单、AOP、异常

一、表单验证

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());
    }
}

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