Невозможно проверить данные из enum с помощью средства проверки hibernate - PullRequest
1 голос
/ 27 июня 2019

Я использую валидатор hibernate для проверки объекта DTO. Здесь перед одним вызовом не в состоянии проверить данные доступны или нет в Enum Я использовал ниже enum

public enum DeliveryMethodEnum {
    IMMEDIATE(1), 
    SCHEDULED(2);

    private Integer deliveryMethod;

    private DeliveryMethodEnum(Integer deliveryMethod) {
        this.deliveryMethod = deliveryMethod;
    }

    public Integer getDeliveryMethod() {
        return deliveryMethod;
    }
}

В DTO используйте пользовательскую аннотацию, как показано ниже

@ EnumValidator (message = "1008", enumClass = DeliveryMethodEnum.class) private Integer deliveryMethod;

Request is below
{
    "deliveryMethod": 8
}

Должен отображаться неверный запрос, но он не проверен перечислением.

У меня ниже обычного кода аннотации

@Documented
@Constraint(validatedBy = EnumValidatorImpl.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@NotNull(message = "Value cannot be null")
@ReportAsSingleViolation
public @interface EnumValidator {

    Class<? extends Enum<?>> enumClass();

    String message() default "Value is not valid";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}


public class EnumValidatorImpl implements ConstraintValidator<EnumValidator, Integer> {

    List<String> valueList = null;

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return !valueList.contains(String.valueOf(value));
    }

    @Override
    public void initialize(EnumValidator constraintAnnotation) {
        valueList = new ArrayList<>();
        Class<? extends Enum<?>> enumClass = constraintAnnotation.enumClass();

        @SuppressWarnings("rawtypes")
        Enum[] enumValArr = enumClass.getEnumConstants();

        for (@SuppressWarnings("rawtypes")
        Enum enumVal : enumValArr) {
            valueList.add(enumVal.toString().toUpperCase());
        }
    }
}

1 Ответ

0 голосов
/ 27 июня 2019

Это происходит из-за ошибки в вашем классе EnumValidatorImpl.
Следующая строка

!valueList.contains(String.valueOf(value));

Фактическое значение valueList: [IMMEDIATE, SCHEDULED]
и значение: 8 от полезной нагрузки кузова {"deliveryMethod": 8}
Таким образом, проверка всегда будет неудачной.
Также !valueList.contains это будет допустимо для не перечисляемых значений, если вам нужно проверить только для перечисленных значений, удалите символ !.

* Решения 1014 * 1. Принять как строку из запроса как

{
    "deliveryMethod": "IMMEDIATE"
}

or

{
    "deliveryMethod": "SCHEDULED"
}

Следовательно, необходимо обновить DTO, теперь значение является одним из перечисления / нет и проверяется

  1. Создать valueList как [1, 2] и проверить.

Здесь обновляется EnumValidatorImpl.java

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class EnumValidatorImpl implements ConstraintValidator<EnumValidator, Integer> {

    List<Integer> valueList = null;

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return valueList.contains(value);
    }

    @Override
    public void initialize(EnumValidator constraintAnnotation) {
        valueList = new ArrayList<>();  
        Class<? extends Enum<?>> enumClass = constraintAnnotation.enumClass();

        Enum[] enumValArr = enumClass.getEnumConstants();
        valueList = Arrays.stream(enumValArr)
                .map(anEnum -> ((DeliveryMethodEnum) anEnum).deliveryMethod)
                .collect(Collectors.toList()); // This will make problem, since it will only be used for DeliveryMethodEnum enum type and not for any other enum, if it is not the problem then this can be done,else  I could not think of any other way
    }
}

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