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

本文介绍如何在实体类中设置表单验证条件,并通过控制器返回验证结果。此外,还详细介绍了AOP面向切面编程的应用,包括依赖添加、拦截器编写等内容。最后,探讨了异常处理和单元测试的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、表单验证

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.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </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 1564666023@qq.com
 * @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 1564666023@qq.com
 * @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 1564666023@qq.com
 *
 * 捕获异常
 */

@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 1564666023@qq.com
 * @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 1564666023@qq.com
 */
@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());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值