Где проверить уникальность поля в Spring / Hibernate - PullRequest
0 голосов
/ 12 марта 2019

Я создаю REST API, используя spring и hibernate.Я столкнулся с проблемой, когда я хочу создать пользователя и хочу узнать, как проверить, может ли он быть создан.

Мой контроллер имеет аннотацию @Valid для объекта User, которая получаетпередается в метод, и это проверяет правильность структуры, однако нет свойства @Unique, которое выбирается @ Valid.

Я использую @Column (unique = true), но это выдает ошибку вуровень персистентности, и я чувствую, что это довольно низкий уровень и затрудняет создание пользовательского исключения UsernameAlreadyExistsException ().

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

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Хорошей практикой будет поставить проверку как в базу данных (о которой мы ничего не знаем, но на самом деле это не сложно), так и со стороны Spring.

Как уже сказал @ kamil-w, aхорошо бы написать собственный валидатор ограничений, см. здесь для примера.

Имейте в виду, что вы всегда можете передать такие параметры, как аннотации ограничений, а затем получить к ним доступ, например, в ConstraintValidator..:

@Entity
public class Member {
  // ...
 @UniqueField(fieldName = "login", context = Member.class)
 private String login;
}



@Component
public class UniqueFieldValidator implements ConstraintValidator<UniqueField, Object> {
 @PersistenceUnit
 private EntityManagerFactory emf;
 private Class validationContext;
 private String fieldName;

  @Override
  public void initialize(UniqueField uniqueField) {
    this.validationContext = uniqueField.validationContext();
    this.fieldName = uniqueField.fieldName();
  }

  @Override
  public boolean isValid(Object value, ConstraintValidatorContext cxt) {
    // use value, this.validationContext, this.fieldName and entity manager to check uniqueness
  }

}
0 голосов
/ 12 марта 2019

По моему мнению, использование пользовательских аннотаций - лучший подход для выполнения подобных задач: вы можете внедрить некоторый компонент в ConstraintValidator и выполнить проверку. Однако вы можете попробовать один из нижеприведенных необычных подходов, возможно, он будет соответствовать вашим требованиям.

Это только мое мнение по этому поводу, в большинстве случаев я думаю, что буду создавать собственные аннотации, чтобы справиться с этим.

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