При попытке использовать мой валидатор ConstraintValidator Integer я получаю «HV000030: не удалось найти валидатор для ограничения» - PullRequest
0 голосов
/ 21 октября 2018

так что не горжусь этим моментом, но здесь мы идем.Я не могу подтвердить 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...