让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)

大家都在看

  • 一文入门Qt Quick

    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」 https://mp.weixin.qq.com/s/dvamU6q5lZQb5hztfD2zNg 初识…

    Linux 2023年6月6日
    0124
  • docker 部署etcd

    原文链接:https://www.zhoubotong.site/post/77.html安装docker-compose这里就不介绍了,直接进入正题:创建etcd数据目录(根据需…

    Linux 2023年6月6日
    0117
  • redis的GEO实战 (RedisTemplate)

    geoadd 时间复杂度为O(log(N)) geoadd cityGeo 116.405285 39.904989 “北京”geoadd cityGeo …

    Linux 2023年5月28日
    097
  • Linux at命令详解

    大家好,我是良许。 生活中,我们有太多场景需要使用到闹钟,比如早上 7 点起床,下午 4 点开会,晚上 8 点购物,等等。 在 Linux 系统里,我们同样也有类似的需求。比如我们…

    Linux 2023年6月14日
    080
  • CSRankings: Computer Science Rankings

    CSRankings is a metrics-based ranking of top computer science institutions around the worl…

    Linux 2023年6月13日
    0124
  • 使用Linux Deploy将闲置的安卓手机改造简易服务器

    本文将介绍我在自己闲置的小米4手机安装CentOS系统的过程。手机配置信息:MIUI 9开发版(方便ROOT)、Android 6、架构 ARMv7(arm32) 准备工作 1、手…

    Linux 2023年6月8日
    0112
  • Running powershell scripts during nuget package installation and removal

    来源:https://devblogs.microsoft.com/nuget/NuGet-3-What-and-Why/ Since Visual Studio 2015 was…

    Linux 2023年5月28日
    0100
  • linux 系统迁移到lvm分区

    对于普通分区磁盘空间不够,而采用lvm分区,原来系统进行迁移或者备份还原。 dd命令用于将整个硬盘进行备份,包括uuid,适用于对对整个物理盘的备份 tar 备份可以对整个系统进行…

    Linux 2023年6月14日
    095
  • 模板层

    过滤器 语法结构 {{ 数据对象|过滤器名称:参数 }} 过滤器最多只能额外传输一个参数 常见过滤器 标签 注意事项 在django模板语法中写标签的时候,只需要写关键字然后tab…

    Linux 2023年6月7日
    096
  • 【Example】C++ 虚基类与虚继承 (菱形继承问题)

    C++ 是支持多继承的语言, 但是实际项目开发中非必要不要使用多继承以降低代码逻辑的复杂性,当然 C++ 多继承的特性带来一些问题即 菱形继承。 当一个类继承了两个来自同父类的子类…

    Linux 2023年6月13日
    079
  • archLinux 配置用户

    archlinux 启动之后只有默认的root用户,首先介绍下系统启动到登录需要的步骤 1.系统通过systemd 以pid为1初始化系统,启动系统用户和系统必要的服务,(这一步目…

    Linux 2023年6月13日
    084
  • 常见框架漏洞

    ThinkPHP 框架漏洞 thinkphp是一个国内轻量级的开发框架,采用php+apache,在更新迭代中,thinkphp也经常爆出各种漏洞,thinkphp一般有think…

    Linux 2023年6月14日
    097
  • redis普通手动启动安装步骤

    redis还提供了普通安装,也就是不写入开机启动,步骤如下: 部署的是redis-4.0.10版本, 部署步骤如下: 1、上传到服务器,解压 tar zxvf redis-4.0….

    Linux 2023年5月28日
    0104
  • Redis时延问题分析及应对

    Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞;当redis的数据量达…

    Linux 2023年5月28日
    094
  • 访问github 与 mac修改hosts并刷新DNS

    加速githubhttps://ipaddress.com/website/github.global.ssl.fastly.nethttps://ipaddress.com/we…

    Linux 2023年6月8日
    0117
  • Docker-数据卷管理

    Docker-数据卷管理 1.利用数据卷和数据容器管理数 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Co…

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