美文网首页springSpringFramework征服Spring
【Springboot之参数校验1】通过切面AOP实现入参校验

【Springboot之参数校验1】通过切面AOP实现入参校验

作者: zetting | 来源:发表于2018-12-20 10:26 被阅读17次

最简洁、最少侵入实现接口入参校验

原创:https://www.jianshu.com/p/a9e96e815b53

目录

  • 实现入参校验Aop
  • 使用入参校验Aop
  • 演示

实现入参校验Aop

1.定义一个入参基类

package com.code1.aop;

/**
 * 基础请求基类
 *
 * @author: zet
 * @date: 2018/8/22 7:15
 */
public class Request {
}

2.实现入参校验切面

 
package com.code1.aop;

import com.code1.base.BusinessCode;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

import javax.annotation.Resource;
import javax.validation.ConstraintViolation;
import javax.validation.groups.Default;
import java.util.Iterator;
import java.util.Set;

/**
 * controller 层入参校验切面
 *
 * @Author linzetian
 * @Date 2017/11/15 21:50
 **/
@Order(2)
@Component
@Aspect
public class ValidatorAspect {
    @Resource
    private LocalValidatorFactoryBean localValidatorFactoryBean;

    public ValidatorAspect() {
    }

    /**
     * 切入点
     */
    @Pointcut(
            "@annotation(org.springframework.web.bind.annotation.RequestMapping)" +
                   "||@annotation(org.springframework.web.bind.annotation.GetMapping)" +
                    "||@annotation(org.springframework.web.bind.annotation.PostMapping)" +
                    "||@annotation(org.springframework.web.bind.annotation.PutMapping)"
    )
   // @Pointcut("execution(* com.*..controller.*.*(..))")//方式2
    private void parameterPointCut() {
    }

    /**
     * 处理
     *
     * @param joinPoint
     * @param request
     */
    @Before("parameterPointCut() && args(request,..)")
    public void validateParameter(JoinPoint joinPoint, Request request) {
        Set<ConstraintViolation<Request>> validErrors = this.localValidatorFactoryBean.validate(request, new Class[]{Default.class});
        Iterator iterator = validErrors.iterator();
        StringBuilder errorMsg = new StringBuilder();

        while (iterator.hasNext()) {
            ConstraintViolation constraintViolation = (ConstraintViolation) iterator.next();
            String error = constraintViolation.getPropertyPath() + ":" + constraintViolation.getMessage();
            errorMsg.append(iterator.hasNext() ? error + "; " : error);
        }
        if (!validErrors.isEmpty()) {
          throw new BusinessException(BusinessCode.PARAM_ILLEGAL, errorMsg.toString());
        }
    }
}

使用入参校验Aop

1.入参请求类集成基类Request并在相应字段加上校验注解

package com.code1.modules.dto;

import com.code1.aop.Request;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;

import javax.validation.constraints.NotNull;

/**
 * 入参校验请求
 *
 * @author: zet
 * @date: 2018/12/19 22:16
 */
@Data
public class ValidateRequest extends Request {
    /**
     * 用户名
     */
    @NotBlank
    private String userName;

    /**
     *性别
     */
    @NotNull
    private Integer sex;

    /**
     * 地址
     */
    private String address;
}

2.controller层正常使用、无需添加任何东西

package com.code1.modules.controller;

import com.code1.modules.dto.ValidateRequest;
import com.code1.base.Response;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 第一个springboot应用
 *
 * @author oKong
 */
@RestController
@RequestMapping("/param/")
public class MyController {

    @GetMapping(value = "/validate")
    public Response validate(ValidateRequest request) {
        return Response.success();
    }
}

演示

1.入参不合法


参数为空.jpg

2.入参合法


校验通过.jpg

gitee源码:
https://gitee.com/Zetting/my-gather/tree/master/code1-param-validate

相关文章

网友评论

    本文标题:【Springboot之参数校验1】通过切面AOP实现入参校验

    本文链接:https://www.haomeiwen.com/subject/kngskqtx.html