Подтвердить что ты не робот

Как отключить проверку Hibernate в проекте загрузки Spring

У меня есть проект загрузки spring, у которого есть CrudRepository, Entity и Controller. Я в основном пытаюсь сохранить объект на основе данных, переданных контроллеру.

Для этого я использую spring-boot-starter-jpa. My Entity аннотируется аннотациями JSR-303, которые проверяются в контроллере, прежде чем данные будут переданы в CrudRepository для сохранения.

Метод контроллера:

@RequestMapping(value = "users", method = { RequestMethod.POST })
public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
    if (validation.hasErrors()) {
        throw new ValidationException(validation);
    }
    User saved = this.users.save(user);
    return new SuccessfulResponse<User>(saved);
}

Entity:

@Entity /* JPA */
public class User {

   @Id /* JPA */
   @Column(name="email_address", nullable=false, length=255) /* JPA */
   @UserUnique
   private String emailAddress;

}

Причиной моих проблем является аннотация UserUnique. Его валидатор выглядит следующим образом:

public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {

   private UserRepository users;

   @Autowired
   public UserUniqueValidator(UserRepository users) {
       this.users = users;
   }

   @Override
   public void initialize(UserUnique annotation) {}

   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
       return users.findOne(value) == null;
   }
}

Что, кажется, происходит, проверка выполняется дважды. Один раз в контроллере с помощью аннотации @Valid и один раз, когда Hibernate пытается сохранить объект. Однако, когда Hibernate пытается сохранить объект, он бросает:

javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`

Это похоже на то, что его не spring -aware и не могут вставлять зависимость в конструктор. Итак, что я хочу сделать, это полностью отключить проверку Hibernate (как ее избыточность и уже происходит в контроллере).

Кажется, что свойство называется javax.persistence.validation.mode, которое вы можете установить на none. Тем не менее, я не могу, чтобы жизнь меня определяла, где установить его в кодовой конфигурации.

Я понимаю, что есть такие вопросы, как инъекция зависимостей JSR-303 и Hibernate, но все они используют конфигурацию xml и вручную настраивают части уровня сохранения.

То, что я хочу сделать, это "пост-настроить" требуемые части уровня сохранения, которые spring Boot создает для меня, потому что, если я определяю свой собственный, я больше не использую конфигурацию загрузки spring Boot. Может ли кто-нибудь помочь мне определить, если 1) это возможно, и 2) какие части мне нужно настроить и как?

Спасибо!

4b9b3361

Ответ 1

As [M. Deinum], упомянутый в комментарии к моему оригинальному сообщению, решение состоит в том, чтобы установить:

spring.jpa.properties.javax.persistence.validation.mode=none

В файле application.properties.

Кроме того, это поведение описано здесь (его легко пропустить, потому что ни один пример не предоставлен).

Ответ 2

Здесь это свойство работает для меня

# Hibernate ddl auto (create, create-drop, validate, update, none)
spring.jpa.hibernate.ddl-auto=none