Java 验证约束不适用于字符串列表
我已经创建了一个自定义验证器来验证字符串。它对单个字符串有效,但对字符串列表无效。这就是我迄今为止所尝试的:Java 验证约束不适用于字符串列表,java,micronaut,Java,Micronaut,我已经创建了一个自定义验证器来验证字符串。它对单个字符串有效,但对字符串列表无效。这就是我迄今为止所尝试的: @Get("/test1") public String test1( @QueryValue(value = "ids") List<@DurationPattern String> ids) { //NOT WORKING return "not working"; } @Get(&quo
@Get("/test1")
public String test1(
@QueryValue(value = "ids") List<@DurationPattern String> ids) { //NOT WORKING
return "not working";
}
@Get("/test2")
public String test2(
@QueryValue(value = "id") @DurationPattern String id){ //WORKS
//it does not get here which is what I want.
return "done";
}
实际验证器:
package my.package;
import io.micronaut.context.annotation.Factory;
import io.micronaut.validation.validator.constraints.ConstraintValidator;
import javax.inject.Singleton;
@Factory
public class MyValidatorFactory {
@Singleton
ConstraintValidator<DurationPattern, CharSequence> durationPatternValidator() {
return (value, annotationMetadata, context) -> {
System.out.println("Please Print!!! It doesn't for Strings within List");
return value == null || value.toString().matches("^PT?[\\d]+[SMHD]{1}$");
};
}
}
package my.package;
导入io.micronaut.context.annotation.Factory;
导入io.micronaut.validation.validator.constraints.ConstraintValidator;
导入javax.inject.Singleton;
@工厂
公共类MyValidator工厂{
@独生子女
ConstraintValidator durationPatternValidator(){
返回(值、注释元数据、上下文)->{
System.out.println(“请打印!!!它不适用于列表中的字符串”);
返回值==null | | value.toString().matches(“^PT?[\\d]+[SMHD]{1}$”;
};
}
}
基本上,创建io.micronaut.validation.validator.constraints.ConstraintValidator的实现,并在@Constraint(validatedBy={})中提供它们。
@Target({方法、字段、注释\类型、构造函数、参数、类型\使用})
@可重复(Regexp.List.class)
@保留(运行时)
@记录
@约束(validatedBy={DurationPatternValidator.class,DurationPatternValidatorList.class})//验证单个字符串或字符串列表
public@interface-DurationPattern{
...
}
@独生子女
公共类RegexValidatorList实现ConstraintValidator{
@凌驾
公共布尔值是有效的(…){
....
}
然后在控制器的处理程序方法中使用
@Get("/test1")
public String test1(
@QueryValue(value = "ids") @DurationPattern List<String> ids) { //@DurationPattern would appear outside of diamond brackets for it to work.
return "working now";
}
@Get(“/test1”)
公共字符串test1(
@QueryValue(value=“ids”)@DurationPattern列表ids{/@DurationPattern将出现在菱形括号之外,以便它工作。
返回“正在工作”;
}
如果将列表
参数标记为@DurationPattern List
是否有效?否。不过,我找到了一个解决方案。这可能是一个解决方案,也可能只是一个常规操作,具体取决于您对它的看法。无论如何,我将很快发布解决方案。
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Repeatable(Regexp.List.class)
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {DurationPatternValidator.class, DurationPatternValidatorList.class}) //to validate a single string or a list of strings
public @interface DurationPattern {
...
}
@Singleton
public class RegexValidatorList implements ConstraintValidator<DurationPattern, Collection<CharSequence>> {
@Override
public boolean isValid(...) {
....
}
@Get("/test1")
public String test1(
@QueryValue(value = "ids") @DurationPattern List<String> ids) { //@DurationPattern would appear outside of diamond brackets for it to work.
return "working now";
}