微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

验证约束不适用于字符串列表

如何解决验证约束不适用于字符串列表

我创建了一个自定义验证器来验证字符串。它适用于单个字符串,但不适用于字符串列表。这是我迄今为止尝试过的:

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

我的 @DurationPattern 代码

package my.package;

import javax.validation.Constraint;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import my.package.DurationPattern.List;

@Target({ METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,ParaMETER,TYPE_USE,TYPE,LOCAL_VARIABLE,PACKAGE,TYPE_ParaMETER,MODULE })
@Repeatable(List.class)
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { })
public @interface DurationPattern {

    String message() default "invalid duration ({validatedValue})";

    @Target({ METHOD,MODULE})
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        DurationPattern[] value();
    }
} 

实际验证者:

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

解决方法

基本上,创建 io.micronaut.validation.validator.constraints.ConstraintValidator 的实现并在 @Constraint(validatedBy = { }) 中提供它们

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。