Spring Boot 自定义验证器

Spring boot Custom Validator

提问人:Fedejs 提问时间:8/23/2023 最后编辑:M. DeinumFedejs 更新时间:8/23/2023 访问量:316

问:

我尝试在 Spring boot 3 和 java 17 中实现自定义验证器, 验证字符串日期,但我键入不匹配问题

@Constraint(validatedBy = ...)

这是我的代码:

日期验证.java

@Target( {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateValidator.class)
public @interface DateValidation {
    public String message() default "Invalid color: must be RED, GREEN or BLUE";
    public Class<?>[] groups() default {};
    public Class<? extends Payload>[] payload() default {};
}

日期验证器:.java

public class DateValidator implements ConstraintValidator<DateValidation, String>
{
    @Override
    public boolean isValid(String stringDate, ConstraintValidatorContext cxt) {
        .....
    }
}

在绒球中.xml

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

错误是:@Constraint(validatedBy)

Type mismatch: cannot convert from Class<DateValidator> to Class<? extends ConstraintValidator<?,?>>[]
Spring-Boot 验证

评论

0赞 M. Deinum 8/23/2023
让我猜猜您正在使用 Spring Boot 3 并决定添加而不是使用 .Spring Boot 3 使用 JakartaEE 类,而不是 JavaEE 类。删除一个,然后使用并导入类而不是 .javax.validationspring-boot-starter-validationjavax.validationspring-boot-starter-validationjakarta.validationjavax.validation
0赞 Fedejs 8/23/2023
感谢您的回复,但就像我在问题中写的那样,我使用 spring-boot-starter-validation e jakarta .
0赞 M. Deinum 8/23/2023
显然你没有,因为添加了另一个依赖项,否则你会有正确的类并且没有错误。将您的依赖项添加到问题中(您的 pom.xml 或 build.gradle)。删除已是依赖项一部分的依赖项。hibernate-validatorspring-boot-starter-validation
0赞 Fedejs 8/23/2023
你是绝对正确的,我在 pom 中有一个我完全忘记的 javax 验证依赖项。非常感谢您的回答,如果您将其表述为答案,我会将其作为公认的答案。

答:

1赞 Sivanta Foundations 8/23/2023 #1

在 Spring Boot 中创建自定义验证程序涉及几个步骤。让我们一步一步地完成这个过程:

  1. 创建自定义验证注释:

首先创建一个自定义批注,该批注将用于标记要验证的字段。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CustomValidator.class)
public @interface CustomValidation {
    String message() default "Custom validation error message";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
  1. 实现验证器:

创建实现接口的类。这是定义验证逻辑的地方。CustomValidatorConstraintValidator

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CustomValidator implements ConstraintValidator<CustomValidation, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // Implement your validation logic here
        // Return true if the value is valid, false otherwise
    }
}
  1. 使用自定义验证程序:

现在,您可以在 Spring 组件(例如 DTO 或实体)中使用自定义验证器。

public class MyDTO {
    @CustomValidation
    private String customField;

    // Other fields, getters, setters
}
  1. 与 Spring Boot 集成:

确保您的 Spring Boot 应用程序已设置为执行验证。这通常涉及在应用程序配置中启用验证。

import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

@Configuration
public class ValidationConfig {
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
}
  1. 在服务/控制器中使用自定义验证程序:

现在,当您在 DTO 中的字段上使用自定义注释时,Spring Boot 的验证机制将自动调用您的自定义验证器。

@RestController
public class MyController {
    @PostMapping("/validate")
    public ResponseEntity<String> validate(@Valid @RequestBody MyDTO myDTO) {
        // Your controller logic here
    }
}

就是这样!您已在 Spring Boot 中创建了自定义验证程序。请记住在类中实现实际的验证逻辑。此外,请确保在项目的构建文件(等)中具有必要的验证依赖项。CustomValidatorjavax.validation

评论

0赞 Fedejs 8/23/2023
感谢您的回复,但这根本没有回答我的问题。它似乎是由 chatgpt 或类似方式生成的。
0赞 Andrei Lisa 8/23/2023
从 spring boot 3.x 软件包被替换为javax.jakarta.
1赞 M. Deinum 8/23/2023 #2

这通常来自这样一个事实,即依赖项中存在徘徊的依赖项。Spring Boot 3 支持 JakartaEE API,而不是 JavaEE API(因为它没有进一步开发并移至 JakartaEE)。javax.validation

确保仅添加依赖项。这包括所有需要的依赖项(包括 API 以及 形式的实现)。spring-boot-starter-validationhibernate-validator

检查你自己的,如果没有依赖项徘徊。如果它们不在你自己的依赖项中,它们可能会被其他不兼容的依赖项拉入。可以使用 .pom.xmljavax.validationmvn dependency:tree

最后,确保只在代码中使用包,而不是将 和 .jakarta.validationjavax.validationjakarta.validation