Есть ли аннотация для проверки java, если значение поля в списке объектов дублируется? - PullRequest
3 голосов
/ 28 января 2020

У меня есть список объектов, и у каждого объекта есть электронная почта, я хотел бы проверить, дублирована ли электронная почта в этом списке.

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
Father create(@PathVariable String id,
        @Valid @RequestBody Father father) {
   ...
}

Отец будет иметь список дочерних:

private List<Child> childs;

Каждый ребенок получит электронное письмо:

public class Child {
  ...

  @NotEmpty
  private String email;

  ...
}

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

Это возможно или только проверяется после получения и обработки полезной нагрузки?

Ответы [ 2 ]

1 голос
/ 29 января 2020

Отредактировано

Для проверки списка дочерних электронных писем вы можете создать пользовательскую проверку.

Я кодировал пользовательскую проверку следующим образом

1- Создать аннотацию с именем ChildEmailValidation

@Documented
@Constraint(validatedBy = ChildEmailValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ChildEmailValidation {

    String message() default "Duplicate Email";

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

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

}

2 - Создать валидатор для ChildEmailValidation

В этой части , вы можете написать свой бизнес для проверки. (Вы можете написать свой алгоритм)

    public class ChildEmailValidator implements ConstraintValidator<ChildEmailValidation, List<Child>> {

    @Override
    public void initialize(ChildEmailValidation constraintAnnotation) {

    }

    @Override
    public boolean isValid(List<Child> childList, ConstraintValidatorContext constraintValidatorContext) {

        //Create empty mailList
        List<String> mailList = new ArrayList<>();

        //Iterate on childList
        childList.forEach(child -> {

            //Checks if the mailList has the child's email
            if (mailList.contains(child.getMail())) {

                  //Found Duplicate email
                  throw new DuplicateEmailException();

            }

            //Add the child's email to mailList (If duplicate email is not found)
            mailList.add(child.getMail());

        });


        //There is no duplicate email
        return true;
      }

    }

3- Добавить @ChildEmailValidation в класс отца

public class Father {

    List<Child> child;

    @ChildEmailValidation
    public List<Child> getChild() {
        return child;
    }

    public void setChild(List<Child> child) {
        this.child = child;
    }
} 

4- Поставить @Valid в fatherDto в контроллере

@RestController
@RequestMapping(value = "/test/", method = RequestMethod.POST)
public class TestController {

    @RequestMapping(value = "/test")
    public GenericResponse getFamily(@RequestBody @Valid Father fatherDto) {
        // ...
    }

}
0 голосов
/ 29 января 2020

Вы можете использовать @UniqueElements аннотацию Hibernate, которую вы можете найти в этой документации Она основана на equals некоторого элемента.

@UniqueElements
private List<Child> childs;
...