所以对我来说不是一个骄傲的时刻,但是我们走了。由于某种原因,我缺少某些内容或误解了文档,因此无法验证我的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')