Springboot 自定义验证注解及提示消息模板

  • Post author:
  • Post category:其他




依赖

plugins {
    id 'org.springframework.boot' version '2.5.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.stone'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.11'

repositories {
    mavenLocal()
    maven {
        url 'https://maven.aliyun.com/repository/public/'
    }
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:2.5.3'

    // Lombok
    compileOnly 'org.projectlombok:lombok:1.18.20'
    annotationProcessor 'org.projectlombok:lombok:1.18.20'

    // Hutool 工具包
    implementation 'cn.hutool:hutool-all:5.7.7'

    // 参数验证
    implementation 'org.springframework.boot:spring-boot-starter-validation:2.5.3'

	testImplementation('org.springframework.boot:spring-boot-starter-test:2.5.3') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}



自定义验证注解 InspectFilePath.java

import com.stone.common.config.validator.InspectFilePathValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @author <a href="https://github.com/zichen1019">zichen</a>
 */
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = InspectFilePathValidator.class)
public @interface InspectFilePath {

    String message() default "文件{param}禁止包含特殊符号:{toast}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    boolean isFileName() default false;

}



自定义注解实现类 InspectFilePathValidator.java

import cn.hutool.core.util.StrUtil;
import com.stone.common.config.annotations.InspectFilePath;
import com.stone.common.utils.common.PreventFilePathAttacks;
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidator;
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorInitializationContext;

import javax.validation.ConstraintValidatorContext;
import javax.validation.metadata.ConstraintDescriptor;

/**
 * @author <a href="https://github.com/zichen1019">zichen</a>
 */
public class InspectFilePathValidator implements HibernateConstraintValidator<InspectFilePath, CharSequence> {

    private boolean isFileName;

    @Override
    public void initialize(ConstraintDescriptor<InspectFilePath> constraintDescriptor, HibernateConstraintValidatorInitializationContext initializationContext) {
        isFileName = constraintDescriptor.getAnnotation().isFileName();
    }

    /**
     * 检查是否符合规则
     *
     * @param value 被检查的值
     * @param constraintValidatorContext    验证上下文
     * @return  true 符合规则 false 不符合规则
     */
    @Override
    public boolean isValid(CharSequence value, ConstraintValidatorContext constraintValidatorContext) {
        String toast;
        if (isFileName) {
            toast = PreventFilePathAttacks.inspectFileName(value.toString());
            if (StrUtil.isNotBlank(toast)) {
                constraintValidatorContext.unwrap( HibernateConstraintValidatorContext.class ).addMessageParameter( "file", "名称" ).addMessageParameter( "toast", toast );
                return false;
            }
        }
        toast = PreventFilePathAttacks.inspectFilePath(value.toString());
        if (StrUtil.isNotBlank(toast)) {
            constraintValidatorContext.unwrap( HibernateConstraintValidatorContext.class ).addMessageParameter( "file", "路径" ).addMessageParameter( "toast", toast );
            return false;
        }
        return true;
    }

}



注入校验对象

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.validation.Validation;
import javax.validation.Validator;

/**
 * 默认会校验完所有属性,然后将错误信息一起返回,但很多时候不需要这样,一个校验失败了,其它就不必校验了.
 *
 * @author zichen
 */
@Configuration
public class ValidatorConfig {

    @Bean
    public Validator validator() {
        return Validation.byProvider(HibernateValidator.class)
                .configure()
                .failFast(true)
                .buildValidatorFactory()
                .getValidator();
    }

}



请求方法上添加验证注解@Validated

    @GetMapping("/xxx")
    public void xxx(@Validated XxxDTO xxxDTO) {
    }



实体类增加验证

import com.stone.common.config.annotations.InspectFilePath;
import lombok.Data;

/**
 * @author <a href="https://github.com/zichen1019">zichen</a>
 */
@Data
public class YsjlDeleteEnclosureImgDTO {

    @InspectFilePath(isFileName = true)
    private String fileName;

    private String id;

}



版权声明:本文为qq_29185141原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。