让SpringBoot也用上Fluent Validator

前言

在使用SpringBoot的时候经常需要对客户端传入的参数进行合法性的校验,校验的方法基本上都是使用SpringBoot提供的注解,有时候遇上注解不能满足需求的时候还需要在业务逻辑上进行判断。这样根本就没有实现解耦。

使用方法

项目maven引入


    com.github.mvallim
    java-fluent-validator
    1.10.0

声明实体校验器

package com.a.b.aspect;

import br.com.fluentvalidator.AbstractValidator;
import com.a.b.LoginDto;

import java.util.function.Predicate;

import static br.com.fluentvalidator.predicate.CollectionPredicate.empty;
import static br.com.fluentvalidator.predicate.CollectionPredicate.hasSize;

public class LoginDtoValidator extends AbstractValidator {

    // 支持注入
    @Autowired
    TestService testService;

    @Override
    public void rules() {
        setPropertyOnContext("loginDto");

        ruleFor(LoginDto::getUsername)
                .must(s -> s.equals("admin"))
                .withMessage("哈哈,错了")
                // 当发生错误则阻止继续校验
                .critical()
                .must(s-> s.equals(getPropertyOnContext("password",String.class)))
                .withMessage("密码和账号必须要一样的");
    }
}

配置切入点

package com.a.b.aspect;

import br.com.fluentvalidator.context.Error;
import br.com.fluentvalidator.context.ValidationResult;
import com.a.b.LoginDto;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
@Slf4j
public class TestAspect {

    @Before("execution(* com.a.b.*.controller.*.*(..)) ")
    public void doBefore(JoinPoint joinPoint){
        Object arg = joinPoint.getArgs()[0];
        ValidationResult validate = new LoginDtoValidator().validate((LoginDto) arg);

        // 获取校验结果
        log.debug("validate {}",validate.isValid());
        StringBuilder stringBuilder = new StringBuilder();

        // 打印并拼接错误信息
        for (Error error : validate.getErrors()) {
            log.debug("error {}",error);
            stringBuilder.append(error.getMessage()).append("\n");
        }

        throw new Exception(stringBuilder.toString());
    }
}

参考资料

项目地址

AOP

Original: https://www.cnblogs.com/ykbb/p/16734817.html
Author: 一块白板
Title: 让SpringBoot也用上Fluent Validator

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610652/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • gitlab CIDI 构建环境优化

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月30日
    0246
  • WEB安全信息收集

    每次做测试都要去网上找信息太费劲这里放了常用的所有工具和网站,后期有更新在改。 子域名&敏感信息 通过大量的信息收集,对目标进行全方位了解,从薄弱点入手。 利用Google…

    Linux 2023年6月7日
    056
  • Linux的常用shell命令

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月24日
    0162
  • git提交代码前将HTML文件的代码进行格式化

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月30日
    0229
  • WEB自动化-06-命令行运行Cypress

    6 命令行运行Cypress Cypress命令行的运行基本语法格式如下所示: cypress <command> [options] command代表运行的命令,是…

    Linux 2023年6月7日
    090
  • Linux 网络时间同步

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月20日
    0218
  • python练习题:利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法

    方法一: 方法二: (此方法会有一个问题,当字符串仅仅是一个空格时’ ‘,会返回return s[1:0];虽然不会报错,但是会比较奇怪。测试了下,当s=&…

    Linux 2023年6月8日
    069
  • 飞鸽传书:一个局域网QQ

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年10月12日
    0232
  • Redis 缓存穿透、雪崩、击穿以及相关解决方案

    缓存流程: 缓存穿透: 什么是缓存穿透:是指 redis 和数据库都没有这个数据,大量请求该数据造成数据库挂掉,该请求一般是非正常用户 解决方案: 布隆过滤器:将数据库中所有的查询…

    Linux 2023年5月28日
    057
  • RPA工单查询和下载流程机器人

    bash;gutter:true;1、登录业务系统,输入用户名和密码2、进入下载模块3、输入下载查询条件4、进入文件明细单5、下载文件视频地址:https://www.bilibi…

    Linux 2023年6月7日
    0111
  • linux系统应急响应排查手册

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月24日
    0176
  • powershell 编写的tui界面脚本《电壳别名宝》

    中文名: 《电壳别名宝》 English name: 《Power Alias》 powershell 编写的tui界面脚本。 用途:保存容易记住的别名(支持中文),保存linux…

    Linux 2023年6月14日
    067
  • Linux休眠与唤醒—wakelock唤醒锁与autosleep功能使用

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月26日
    0274
  • 我叫Mongo,干了「查询终结篇」,值得您拥有

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年11月8日
    0212
  • OpenSSL测试-SM3

    任务详情 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 使用OpenSSL的命令计算你的8位学号的摘要值(SM3),提交截图(5’…

    Linux 2023年6月8日
    071
  • SpringBoot——自定义Redis缓存Cache

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月14日
    0205
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球