首页 > 其他分享 >自定义注解实现接口入参字段校验

自定义注解实现接口入参字段校验

时间:2024-01-15 14:12:20浏览次数:21  
标签:lang java 参字段 自定义 校验 import validation annotation

使用的类javax.validation

导入的包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>xxxx.RELEASE</version>
</dependency>

通过springboot的其他包已经依赖hibernate-validator,一般是spring-boot-starter-web 或者单独导入spring-boot-starter-validation 也可以。不能单独导入hibernate-validator,会报错

自定义校验类

import com.haier.boot.valid.enums.ValidListEnum;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;


/**
 * ValidListEnum: 校验的注解
 * Object:校验对象属性类型 Object表示所有类型都可以
 */
public class ValidListValidator implements ConstraintValidator<ValidListEnum, Object> {
    
    private List<String> codes;
    
    @Override
    public void initialize(ValidListEnum constraintAnnotation) {
        codes = Arrays.asList(constraintAnnotation.list().split(","));
    }
    
    /**
     * obj 调接口时传的实参
     */
    @Override
    public boolean isValid(Object obj, ConstraintValidatorContext constraintValidatorContext) {
        if (obj == null || codes == null || codes.size() == 0) {
            return true;
        }
        return codes.contains(obj.toString());
    }
}

自定义注解

import com.haier.boot.valid.validator.ValidListValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
// 导入校验类
@Constraint(validatedBy = ValidListValidator.class)
public @interface ValidListEnum {
    /**
     * @return class containing enum values to which this String should match
     */
    String list() default "";

    /**
     * @return the error message template
     */
    String message() default "com.haier.hrwms.common.annotation.ValueOfEnum.message";

    /**
     * @return the groups the constraint belongs to
     */
    Class<?>[] groups() default {};

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

}

全局异常处理(获取所有校验不通过的参数)

import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public String methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        log.error("入参异常", e);
        BindingResult bindingResult = e.getBindingResult();
        StringBuilder errMsgStringBuilder = new StringBuilder("参数校验失败:");
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            errMsgStringBuilder.append(String.format("%s.%n", fieldError.getDefaultMessage()));
        }
        return errMsgStringBuilder.toString();
    }

}

测试

import javax.validation.Valid;

@PostMapping("/export/list/testUser")
    public void testUser(@RequestBody @Valid Person testUser) {
        helloWorldService.testUser(testUser);
    }

标签:lang,java,参字段,自定义,校验,import,validation,annotation
From: https://www.cnblogs.com/shareToAll/p/17965240

相关文章

  • java Flink 校验接口数据
    要使用Java编写Flink程序来校验接口的数据,可以按照以下步骤进行操作。首先,需要引入相关依赖包。在pom.xml文件中添加如下依赖项:org.apache.flinkflink-streaming-java_2.12{FLINK版本号}其中{FLINK版本号}应该被替换为所使用的Flink版本号。创建一个新的Java类,并导入必要......
  • 自定义监控(kube-prometheus)
       ......
  • SpringBoot动态权限校验,常用的实现方案
    SpringBoot.pngSpringBoot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。SpringBoot通过自动配置功能,降低了复杂性,同时支持基于JVM的多种开源框架,可以缩短开发时间,使开发更......
  • 定时任务及异步,自定义注解进行参数校验
    简单来说:浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。 如何在Spring/SpringBoot中优雅地做参数校验?springboot项目使用validation-api......
  • delphi firemonkey使用 TListbox 自定义列表数据(二StyleBook方式实现)
    上一篇用设计好界面后用代码添加稍微有些麻烦,所以改为用StyleBook设计好后添加Item界面上添加ListBox后改Item高度为100右键添加一条空白记录,观察高度,并且方便自定义编辑style样式默认添加一条ListBoxItem1Style1的样式,添加Layout布局到这个样式下,并且添加需要的控件进去la......
  • SparkSQL 自定义聚合函数[强类型] & DSL
    本文的前提条件:SparkSQLinJava参考地址:UserDefinedAggregateFunctions(UDAFs)1.声明列实体类packagecn.coreqi.entity;importjava.io.Serializable;publicclassUserimplementsSerializable{privateStringusername;privateLongage;publi......
  • 使用 TListbox 自定义列表数据(界面显示)
    界面设计如下启动时默认值procedureTForm1.FormCreate(Sender:TObject);begin//启动时隐藏模板Layout1.Visible:=False;//开启隔行变色ListBox1.AlternatingRowBackground:=True;end;Listbox添加Item代码如下procedureTForm1.AddItem(name:string;......
  • 使用TVertScrollbox自定义列表数据
    界面布局设置如下创建一个过程添加新项目procedureTForm1.AddItem(name:string;age:Integer);varlayout:TLayout;begin//设置姓名标签的文本Label3.Text:=name;//设置年龄标签的文本Label4.Text:=IntToStr(age);//克隆Layout1,并将克隆得到......
  • 计算机硬件-CPU-校验码
    计算机组成部分(冯诺依曼架构):5个部分,运算器、控制器、存储、输入设备、输出设备CPU的功能:程序控制、操作控制、时间控制、数据处理。CPU的组成:主要由运算器、控制器、寄存器和内部总线等部件组成运算器:执行所有的算数运算,如加减乘除等;执行所有的逻辑运算并进行逻辑测试,如与或......
  • SparkSQL 自定义聚合函数[强类型]
    本文的前提条件:SparkSQLinJava参考地址:UserDefinedAggregateFunctions(UDAFs)1.自定义实体类packagecn.coreqi.entity;importjava.io.Serializable;publicclassAverageimplementsSerializable{privatelongtotal;privatelongcount;publi......