首页 > 其他分享 >Spring注解校验@Valid的手动调用

Spring注解校验@Valid的手动调用

时间:2023-06-05 16:44:58浏览次数:37  
标签:自定义 Spring 校验 validator Valid import public

在做Spring项目的时候,@Valid可以完成优雅的参数校验,但是在不少特殊场景下,会有字段组合校验的场景.这种情况下,就需要在后台手动校验,那么如何在后端也优雅的参数校验,避免一堆判断和抛异常呢,可以试试在满足校验场景下手动触发@Valid校验.

1. 第一步:定义校验对象

点击查看代码
package com.sf.wms.finance.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * 自定义参数校验测试DTO
 */
@ApiModel(value = "SelfTestDTO", description = "自定义参数校验测试DTO")
@Data
public class SelfTestDTO {

    @ApiModelProperty(value = "规则名")
    @NotNull(message = "请输入规则名")
    @Size(max = 25 , message = "规则名不能超过25个字符")
    private String ruleName;

}

2. 第二步:自定义校验方法

点击查看代码
package com.sf.wms.finance.hanlder;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.Set;


@Component
public class SelfValid {

    private static Validator validator;

    /**
     * 工具类自然需要静态注入
     * @param validator
     */
    @Autowired
    public void setValidator(Validator validator) {
        SelfValid.validator = validator;
    }

    public static void selfValid(Object t) {
        Set<ConstraintViolation<Object>> set = validator.validate(t);
        StringBuilder stringBuilder = new StringBuilder();
        if (set.size() > 0) {
            stringBuilder.append("校验不通过!");
        } else {
            return ;
        }
        for (ConstraintViolation<Object> constraintViolation : set) {
            stringBuilder.append(constraintViolation.getMessage());
        }
        throw new RuntimeException(stringBuilder.toString());
    }

}

3. 第三步,特殊场景下手动调用自定义校验方法

点击查看代码
// 当满足条件的时候 -> 调用
if(true){
    mkSaveDTOList.forEach(mkSaveDTO ->  SelfValid.selfValid(mkSaveDTO));
}

标签:自定义,Spring,校验,validator,Valid,import,public
From: https://www.cnblogs.com/xueqizheng/p/17458117.html

相关文章

  • Spring Bean生命周期详解
    本文结合Spring源码5.1.7.RELEASE,详细分析SpringBean生命周期,包括主要流程以及Spring一系列的扩展方法,最后通过测试实例演示主要步骤。Spring提供的Bean扩展方法大致分为三类,一类是BeanPostProcessor接口,一类是BeanFactoryProcessor接口,还有一类是Aware接口。Sprin......
  • spring中默认标签alias、import标签解析
    1、Alias标签在bean标签里边有一个alias属性和name属性,可以指定bean的别名,但是有的场景下,在定义bean的时候就把他的别名都指定好是不适用的。比如这个Bean在组件A中,想把他叫做componentA,但是在组件B中又想把他叫做componetB,所以还有一个单独的标签:<alias>专门解决上述场景的。<......
  • 使用powermock写springboot2.7业务类的测试用例
    1,引入powermock依赖<dependency><groupId>org.powermock</groupId><artifactId>powermock-core</artifactId><version>2.0.9</version><scope>test</......
  • 【SpringBoot】如何配置静态资源的地址与访问路径
    静态资源,例如HTML文件、JS文件,设计到的SpringBoot配置有两项,一是“spring.mvc.static-path-pattern”,一是“spring.resources.static-locations”,很多人都难以分辨它们之间的差异,所以经常出现的结果就是404错误,无法找到静态资源。1.spring.mvc.static-path-patternspring.mvc.sta......
  • springmvc架构流程
    1、 用户发送请求至前端控制器DispatcherServlet2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4、 DispatcherServlet通过HandlerAdap......
  • 为SpringBoot Admin监控的服务端加上登录认证
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>packagecom.ciih.refineinner.config;importlombok.extern.slf4......
  • 为SpringBoot Admin加上登录认证
    依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>配置server:port:8000spring:security:user:n......
  • springmvc后端接收前端数据的四种方式
    前端登录页面代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><h1>登录页面</h1><formaction="login.do"......
  • SpringBoot Admin的基本使用(单体应用)
    springboot项目和springbootadmin项目不建议放在一起,因为目的是为了监控,如果放在一起的话,一旦springboot挂了,springbootadmin也就一起挂了,监控就失去意义.搭建监控项目:<dependencies><dependency><groupId>org.springframework.boot</groupId>......
  • SpringBoot2.x跨域问题(CrossOrigin失效问题)
    方法一SpringBoot版本的不同,CrossOrigin失效了,正确配置如下:@CrossOrigin(originPatterns="*",allowCredentials="true",maxAge=3600)方法二如果以上方法还是不生效,最后的终极方法可以进行硬编码进行跨域设置:对需要跨域的接口,进行Response对象设置可跨域URL设置(*代表......