Пользовательский валидатор генерирует исключение javax.validation.UnexpectedTypeException: HV000030 - PullRequest
0 голосов
/ 26 марта 2020

Я хочу, чтобы пользователь отправлял числовое значение c для поля в запросе, поскольку пользователь также может вводить символ. Поскольку я не нашел никакого встроенного решения для проверки mvc весной, я решил создать свой собственный валидатор, чтобы проверить, является ли введенное значение числом или нет. Ниже приведен фрагмент кода.

Интерфейс ограничения:

@Documented
@Constraint(validatedBy =  {IntegerValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
public @interface IntegerConstraint {
    String message() default "Please enter numers only...!!!";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Класс валидатора:

public class IntegerValidator implements ConstraintValidator<IntegerConstraint, String> {
    @Override
    public void initialize(IntegerConstraint contactNumber) {
    }

    @Override
    public boolean isValid(String reqParam, ConstraintValidatorContext cxt) {
        return !StringUtils.isEmpty(reqParam) && reqParam.matches("^(0|[1-9][0-9]*)$");
    }
}

Поле класса DTO:

@IntegerConstraint
@PositiveOrZero(message = "Sorting number either can be positive or zero...!!!")
private Integer sortOrd;

Контроллер :

public ModelAndView addDetail(@Valid @ModelAttribute("fooDetails") FooDTO footDTO,
            BindingResult result, HttpServletRequest request)

Журнал ошибок:

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'com.eps.customvalidator.IntegerConstraint' validating type 'java.lang.Integer'. Check configuration for 'sortOrd'
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getExceptionForNullValidator(ConstraintTree.java:108) ~[hibernate-validator-6.0.10.Final.jar:6.0.10.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:140) ~[hibernate-validator-6.0.10.Final.jar:6.0.10.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.SimpleConstraintTree.validateConstraints(SimpleConstraintTree.java:55) ~[hibernate-validator-6.0.10.Final.jar:6.0.10.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:73) ~[hibernate-validator-6.0.10.Final.jar:6.0.10.Final]

1 Ответ

0 голосов
/ 26 марта 2020

Это может произойти, потому что ваш IntegerValidator реализует ConstraintValidator<IntegerConstraint, String>, поэтому он должен проверять поля String. Но вы применяете его в поле Integer.

Вам следует либо изменить ConstraintValidator<IntegerConstraint, String> на ConstraintValidator<IntegerConstraint, Integer>, либо изменить DTO на private String sortOrd;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...