java - 自定义注释初始化方法不起作用
问题描述
这是我的注释类
package com.meet.springdemo.mvc.validation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Constraint(validatedBy = CourseCodeConstraintValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD } )
@Retention(RetentionPolicy.RUNTIME)
public @interface CourseCode {
// define default course code
public String value() default "LUV";
// define default error message
public String message() default "must start with LUV";
// define default groups
public Class<?>[] groups() default {};
// define default payloads
public Class<? extends Payload>[] payload() default {};
}
这是我的 constraintValidator 类,在这里我试图验证输入字符串,无论它是否以给定的前缀开头并返回布尔值true或false。
package com.meet.springdemo.mvc.validation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CourseCodeConstraintValidator
implements ConstraintValidator<CourseCode, String> {
private String coursePrefix;
@Override
public void initialize(CourseCode theCourseCode) {
coursePrefix = theCourseCode.value();
}
@Override
public boolean isValid(String theCode,
ConstraintValidatorContext theConstraintValidatorContext) {
boolean result;
System.out.println("Course prefix : "+ coursePrefix);
System.out.println("Course code : "+ theCode);
if (theCode != null) {
result = theCode.startsWith(coursePrefix);
}
else {
result = true;
}
return result;
}
}
这里initialize()
方法在初始化时没有被调用。并调用 toisValid()
打印任何内容System.out.println("Course prefix : "+ coursePrefix);
。
可以说,输入字符串theCode
为ABCDEF;然后它显示输出为:isValid()
Course prefix :
Course code : ABCDEF
解决方案
假设您有一个具有几个字段的模型,并且您正在尝试验证其中一个名为code
String 类型的字段,并使用@CourseCode
. 假设模型被称为Course
。所以像:
public class Course {
@CourseCode
private String code;
// some other attributes here
public String getCode() {
return this.code;
}
public void setCode(String code) {
this.code = code;
}
// some other getters / setters here
}
Java 提供了一个javax.validation.Valid
可用于约束验证的注解。来自javax.validation.Valid
注释的 Java 文档:
标记验证级联的属性、方法参数或方法返回类型。在验证属性、方法参数或方法返回类型时,验证对象及其属性上定义的约束。此行为以递归方式应用。
因此,基本上您希望将此@Valid
注释应用于您希望验证其定义的约束的对象。假设您Course
在一个非常基本的控制器中使用该模型。您可以像这样注释 POSTedCourse
对象:
@Controller
@RequestMapping
public class CourseController {
@PostMapping
public addNewCourse(@RequestBody @Valid Course newCourse) {
// perform some persistence logic
}
}
在我们进入方法之前,之前的@Valid
注释Course newCouse
将对象标记newCourse
为待验证。addNewCourse
现在您的代码应该输入initialize()
方法,CourseCodeConstraintValidator
然后执行验证逻辑isValid()
推荐阅读
- directshow - 为什么 SampleGrabber::SampleCB 只调用一次而不调用 SetSyncSource(NULL)
- c# - Picturebox按住鼠标按钮后更改图片并释放鼠标后重新更改C#
- r - 更改 jupyter notebook 主题以突出显示 R 功能
- javascript - 如何使用 Selenium 从页面滚动特定 div?
- android - 由于类型不匹配,无法在 Flow 中发出 Either.Left
- typescript - Vue 3 使用 v-model 作为 props 而不是 :prop 和 @emit
- javascript - 为什么在某些情况下“鼠标悬停”不能模拟悬停?
- java - 如何在 netbeans 12.4 中启用本机打包
- pine-script - 如何在松纸上玩弄 SMA 的时间框架?
- amazon-web-services - 在 AWS ElasticBeanstalk 上使用 .ebextensions 为 SQL Server 安装 Microsoft ODBC Driver 17 时出现问题