так что не горжусь этим моментом, но здесь мы идем.Я не могу подтвердить Integer
в моей MVC-модели: D по какой-то причине я что-то упускаю или неверно истолковываю документы.У меня есть Model
, и он содержит значение Integer
, вот и все.Если кто-то вводит abc
вместо 123
, он должен сказать, что ожидает число.Из коробки кажется, что весна не предлагает никакого решения для этого.Я мог бы использовать String
в своей модели вместо этого и перейти на Pattern, но мне нравится Min,Max,Positive
, также я изучаю Spring и хочу понять, что здесь происходит не так :)
Так что я написал свой собственныйcustom ConstraintValidator
, но при проверке он не использует его, вместо этого появляется сообщение typeMatch.java.lang.Integer
(см. заголовок).Во время отладки я увидел, что сам валидатор был «доступен», но он не совпадает с моим Integer value
по загадочной причине.Если я устанавливаю ограничение на ConstraintValidator<IsNumberConstraint, Integer>
, я получаю желаемое сообщение об ошибке при пустом значении, но при вводе строки abc
я получаю NumberFormatException
, но не из моего валидатора, это происходит где-то еще.Я запутался с этим поведением.Как можно раздавать правильные сообщения об ошибках для такого простого случая?
Может ли кто-нибудь дать мне подсказку или даже определить мою ошибку?Использование 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')