Проверка необязательного поля

У меня есть следующий запрос json

{
 "ParameterA":"value",
 "ParameterB":[
  {
    "key":"",
  "value":""
  },
  {
    "key":"",
  "value":""
  }
    ]
}

Я пытаюсь проверить этот json, мое требование таково, что если ParameterB присутствует, то список обязательно должен присутствовать внутри, иначе ParameterB является необязательным. Например, если сам ParameterB отсутствует, не должно быть проблем.

Я ищу аннотацию проверки Java для того же самого. я использовал @NotNull для ключа и значения, но не смог решить, что использовать для ParameterB, поскольку это массив, внутри которого присутствует список

Поскольку у него также есть подключение к базе данных, я использую JPA и делаю этот вызов REST.

Я попробовал @NotEmpty для ParameterB, но это не помогает. Я хочу аннотацию, чтобы, если сам ParameterB не присутствовал, он не влиял на фактический поток. Следующий случай

{
 "ParameterA":"value"
}

любое предложение или помощь будут оценены.


person developer_begins    schedule 30.10.2017    source источник
comment
Опубликуйте соответствующий код и полученное исключение.   -  person JB Nizet    schedule 30.10.2017
comment
Как правило, использование значений null с коллекциями является плохой практикой. Неужели так важно отличать null от пустой коллекции?   -  person Aleh Maksimovich    schedule 30.10.2017


Ответы (2)


Проверка, которую вы ищете, не является стандартной. Я не знаю о существующей аннотации, реализующей такую ​​проверку.

К счастью для вас, javax.validation ограничения можно легко расширить с помощью настраиваемых правил проверки:

а) Создайте аннотацию ограничения

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = NullOrNotEmptyValidator.class)
@Documented
public @interface NullOrNotEmpty {

    String message() default "{com.mycompany.constraints.nullornotempty}";

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

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

}

б) Реализовать валидатор

import java.lang.reflect.Array;
import java.util.Map;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class NullOrNotEmptyValidator implements ConstraintValidator<NullOrNotEmpty, Object> {

    @Override
    public void initialize(NullOrNotEmpty constraintAnnotation) {
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {

        if (object == null) {
            return true;
        }

        final Class<?> fieldClass = object.getClass();
        if (fieldClass.isArray()) {
            return Array.getLength(object) > 0;
        }

        if (Iterable.class.isAssignableFrom(fieldClass)) {
            return ((Iterable) object).iterator().hasNext();
        }

        if (Map.class.isAssignableFrom(fieldClass)) {
            return !((Map) object).isEmpty();
        }

        return false;
    }

}

c) Определить сообщение об ошибке по умолчанию

Этот шаг зависит от механизма проверки, который вы используете.

Статья с примерами для Hibernate Validator: Глава 3. Создание пользовательских ограничений

person Aleh Maksimovich    schedule 30.10.2017

Попробуйте использовать вторую версию Validation API, она поддерживается для java.util.Optional

Подробнее читайте здесь https://beanvalidation.org/2.0

person alex.b    schedule 04.02.2019