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

大家都在看

  • linux命令之tar 解压 压缩

    tar(全称:tape archive )命令用于备份文件。tar 是用来 创建或者 还原备份文件的工具程序,它可以加入,解开备份文件内的文件。tar linux说明 tar [&…

    Linux 2023年5月27日
    073
  • js学习笔记之for循环

    for 循环是在您希望创建循环时经常使用的工具。 for 循环的语法如下: for (语句 1; 语句 2; 语句 3) { 要执行的代码块 } 语句 1 在循环(代码块)开始之前…

    Linux 2023年6月13日
    064
  • 安卓投屏助手(ARDC)最新版

    近几年安卓多屏协同非常火爆,以华为小米为首的各大手机厂商都推出了各自的多屏协同软件,打破手机、平板和VR等安卓设备与电脑的边界,通过多屏融合提高办公的生产力。国内安卓投屏软件有To…

    Linux 2023年6月7日
    0307
  • 前端Web实训项目-教务系统成绩查询

    通过暑期前半个月实训,我们选的方向是Web前端(虽然我想选Java全栈的),所以我们最终确立的主题是做一个网页。 这个项目是我们组四个人做的,因为技术水品都不咋样,所以有很多地方需…

    Linux 2023年6月7日
    0112
  • linux三剑客试题汇总

    1、找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 2、显示etc目录下以root,centos或者user开头的信息 3、找出/etc/init.d/…

    Linux 2023年5月27日
    0104
  • WPF 将控件放入到 UserControl 里获取 HwndSource 为空的情况

    本文记录将 WPF 控件放入到 UserControl 里,如果此 UserControl 没有被设置 Visibility 为可见过,那么放在此 UserControl 内的控件…

    Linux 2023年6月6日
    078
  • 绝了!起个好标题的9大技巧

    许多自媒体经常发一些标题雷人的文章,内容却非常空洞甚至低俗,技术创作领域也未能幸免,这个搞法被大家笑称为”标题党”。互联网是眼球经济,靠标题骗点击量的恶习将…

    Linux 2023年6月6日
    094
  • Shell语法

    在 Shell 中引号分为 2 种:单引号、双引号。 ( 1 )双引号 由双引号括起来的字符,除 $ 、倒引号和反斜线( \ )仍保留其特殊功能外,其余字符通常作为普通字符对待。 …

    Linux 2023年5月28日
    078
  • 从前端走向后端

    每次过年回老家聚会,遇到不熟悉的亲戚朋友,经常被问到职业是什么。一开始,我总是很认真的回答这个问题,结果常常引出一番尴尬的问答。 “你&…

    Linux 2023年6月6日
    093
  • 聊聊简单又灵活的权限设计(RBAC)

    你:我看完能知道个啥?我:也就以下两点吧一. 了解基于 RBAC 思路的表设计二. 表数据在实际开发场景中是如何使用的你:我觉得那应该还有点干货吧我:我不要你觉得,我要我觉得 (͡…

    Linux 2023年6月14日
    093
  • 正则表达式测试

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。 博主…

    Linux 2023年6月13日
    081
  • 分布式中灰度方案实践

    让请求在导航的服务节上点执行; 一、背景简介 分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,为了保持不同版…

    Linux 2023年6月14日
    0107
  • Spring中如何使用自定义注解搭配@Import引入内外部配置并完成某一功能的启用

    有些网站第一时间爬取了我的原创文章,并且没有注明出处,不得已在这里加上说明。 文章背景 有一个封装 RocketMq 的 client 的需求,用来提供给各项目收、发消息,但是项目…

    Linux 2023年6月6日
    0107
  • 记一次echo server出现的问题

    1. 我做了什么 最近在学习如何用select函数实现echo server。期间遇到了一个关于缓冲区的问题,在这里分享给大家。 在使用read/recv, write/send类…

    Linux 2023年6月7日
    092
  • git 那些事儿 —— 基于 Learn Git Branching

    推荐一个 git 图形化教学网站:Learn Git Branching,这个网站有一个沙盒可以直接在上面模拟 git 的各种操作,操作效果使用图形的方式展示,非常直观。本文可以看…

    Linux 2023年5月27日
    0119
  • 运维故障收集-考勤机无法连接考勤机网关系统故障验证流程

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/linuxshare/p/16474967.htmlAu…

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