提问人:Fedejs 提问时间:8/23/2023 最后编辑:M. DeinumFedejs 更新时间:8/23/2023 访问量:316
Spring Boot 自定义验证器
Spring boot Custom Validator
问:
我尝试在 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 中创建自定义验证程序涉及几个步骤。让我们一步一步地完成这个过程:
- 创建自定义验证注释:
首先创建一个自定义批注,该批注将用于标记要验证的字段。
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 {};
}
- 实现验证器:
创建实现接口的类。这是定义验证逻辑的地方。CustomValidator
ConstraintValidator
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
}
}
- 使用自定义验证程序:
现在,您可以在 Spring 组件(例如 DTO 或实体)中使用自定义验证器。
public class MyDTO {
@CustomValidation
private String customField;
// Other fields, getters, setters
}
- 与 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();
}
}
- 在服务/控制器中使用自定义验证程序:
现在,当您在 DTO 中的字段上使用自定义注释时,Spring Boot 的验证机制将自动调用您的自定义验证器。
@RestController
public class MyController {
@PostMapping("/validate")
public ResponseEntity<String> validate(@Valid @RequestBody MyDTO myDTO) {
// Your controller logic here
}
}
就是这样!您已在 Spring Boot 中创建了自定义验证程序。请记住在类中实现实际的验证逻辑。此外,请确保在项目的构建文件(等)中具有必要的验证依赖项。CustomValidator
javax.validation
评论
javax.
jakarta.
这通常来自这样一个事实,即依赖项中存在徘徊的依赖项。Spring Boot 3 支持 JakartaEE API,而不是 JavaEE API(因为它没有进一步开发并移至 JakartaEE)。javax.validation
确保仅添加依赖项。这包括所有需要的依赖项(包括 API 以及 形式的实现)。spring-boot-starter-validation
hibernate-validator
检查你自己的,如果没有依赖项徘徊。如果它们不在你自己的依赖项中,它们可能会被其他不兼容的依赖项拉入。可以使用 .pom.xml
javax.validation
mvn dependency:tree
最后,确保只在代码中使用包,而不是将 和 .jakarta.validation
javax.validation
jakarta.validation
评论
javax.validation
spring-boot-starter-validation
javax.validation
spring-boot-starter-validation
jakarta.validation
javax.validation
hibernate-validator
spring-boot-starter-validation