Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 验证约束不适用于字符串列表_Java_Micronaut - Fatal编程技术网

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";
}