Проверка на enum в весеннем запросе - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть запрос WorkerRequest, в котором есть enum, который имеет FULL_TIME, MANAGER и т. Д.

В WorkerRequest как я могу применить проверку длины к этому перечислению?

Пример: тип enum не должен быть длиннее 8 символов.

FULL_TIME действительный (8 символов)

PERMANENT неверно (9 символов)

В настоящее время, если я поставлю javax.validation.constraints.Size

  @Size(min = 0, max = 8, message = "Allowed length for workerType is 8.")
  @Enumerated(EnumType.STRING)
  private WorkerType workerType;

выдает ошибку:

HV000030: не найден валидатор для ограничения проверочный тип 'javax.validation.constraints.Size' 'Com.XX.XX.XX.WorkerType. Проверьте конфигурацию для 'workerType'

Ответы [ 2 ]

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

Я не вижу необходимости в проверке размера. Факт использования enum в запросе обязывает сериализацию сопоставить значение одному из возможных значений enum. Если вы заполните строку json как «invalid» в качестве рабочего типа, spring выдаст:

org.springframework.http.converter.HttpMessageNotReadableException: ошибка синтаксического анализа JSON: невозможно десериализовать значение типа WorkerType из строки "invalid": значение не одно из объявленных имен экземпляров Enum: и т. Д.

Вы можете поймать исключение в пользовательском обработчике исключений отдыха

0 голосов
/ 04 сентября 2018

Как описано в Разница между @Size, @Length и @Column (длина = значение)

@ Size - аннотация Bean Validation, которая подтверждает, что связанная строка имеет значение, длина которого ограничена минимумом и максимальные значения.

Вы можете указать только максимальную необходимую длину для постоянного значения enum в вашей базе данных. Например, если вы определите @Column(length = 8) вместо @Size, вы увидите соответственно workerType VARCHAR(8) в своем определении БД.

Но есть обходной путь для этого: Предположим, у вас есть

 public enum WorkerType {PERMANENT , FULL_TIME, ...}; 
  1. Определение пользовательской аннотации проверки:

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = EnumSizeLimit.class)
    public @interface EnumSizeLimit {
        String message() default "{com.example.app.EnumSizeLimit.message}";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
        Class<? extends Enum<?>> targetClassType();
    }
    
  2. Реализация валидатора:

    public class EnumSizeLimitValidator implements ConstraintValidator < EnumSizeLimit , String > {
         private Set < String > allowedValues;
    
         @SuppressWarnings({
             "unchecked",
             "rawtypes"
         })
        @Override
        public void initialize(EnumSizeLimit targetEnum) {
        Class << ? extends Enum > enumSelected = targetEnum.targetClassType();
        allowedValues = (Set < String > ) EnumSet.allOf(enumSelected).stream().map(e - > ((Enum << ? extends Enum << ? >> ) e).name())
            .collect(Collectors.toSet());
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            return value == null || (value.length>=0 && value.length<=8)) ? true : false;
        }
    }
    
  3. Определить поле:

    @EnumSizeLimit (targetClassType = WorkerType.class, message = "your message" 
    private String workerType; 
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...