尝试使用ConstraintValidator整数验证器时,我得到“ HV000030:找不到约束的验证器”

时间:2018-10-20 22:59:32

标签: java validation spring-mvc spring-boot groovy

所以对我来说不是一个骄傲的时刻,但是我们走了。由于某种原因,我缺少某些内容或误解了文档,因此无法验证我的MVC-Model:D中的Integer。我有一个Model,它包含一个Integer的值,仅此而已。如果有人输入abc而不是123,则应该说这是一个数字。开箱即用,似乎spring对此没有提供任何解决方案。我可以在模型中使用String并使用Pattern,但我喜欢Min,Max,Positive的同时也正在学习Spring,我想了解这里出了什么问题:)

因此,我编写了自己的自定义ConstraintValidator,但是在验证它未使用它时,却显示了typeMatch.java.lang.Integer消息(见标题)。在调试时,我看到验证器本身是“可用的”,但是出于神秘的原因,它在我的Integer value上不匹配。如果将约束设置为ConstraintValidator<IsNumberConstraint, Integer>,我确实会在出现空值时收到所需的错误消息,但是当输入字符串abc时,我会得到NumberFormatException,但不是从我的验证器那里发生的其他。我对此行为感到困惑。对于这样一种简单的情况,应该如何发出适当的错误消息?

有人可以给我提示,甚至可以发现我的错误吗?在Undertow上使用Spring Boot 2

完整错误:

  

请求处理失败;嵌套异常为   javax.validation.UnexpectedTypeException:HV000030:没有验证程序可以   找到约束   “ com.rubberducky.quack.validators.IsNumberConstraint”正在验证   输入“ java.lang.Integer”。检查配置的“值”

我的约束:

@Documented
@Target({ElementType.PARAMETER, ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IsNumberValidator.class)
public @interface IsNumberConstraint {
    String message() default "Not a number.";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

我的验证者:

public class IsNumberValidator implements ConstraintValidator<IsNumberConstraint, String> {
    @Override
    public void initialize(IsNumber constraint) {}
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return "$value".isNumber()
    }
}

我的界面:

public interface CoreData {
    @IsNumberConstraint(message = "Not a number.")
    @NotNull(message = "Field is mandatory.")
    def Integer value
}

我的控制器方法:

@PostMapping("/coredata/add")
public String coredataAdd(@Valid @ModelAttribute("coreObject") CoreData coreObject, BindingResult bindingResult, Model model, RedirectAttributes redirectAttribs) {
    // NotNull is triggered but never IsNumberConstraint
    println bindingResult.hasErrors() 
}

我的gradle实现:

('org.codehaus.groovy:groovy')

('io.undertow:undertow-core:2.0.13.Final')
('io.undertow:undertow-servlet:2.0.13.Final')

('org.springframework.boot:spring-boot-devtools')
('org.springframework.boot:spring-boot-starter-web')
('org.springframework.boot:spring-boot-starter-validation')
('org.springframework.boot:spring-boot-starter-data-mongodb')

0 个答案:

没有答案