2014-11-05 2 views
11

У меня есть проект загрузки Spring, который имеет CrudRepository, Entity и Controller. Я в основном пытаюсь сохранить объект на основе данных, переданных контроллеру.Как отключить валидацию спящего режима в проекте Spring Boot

Для этого я использую 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` 

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

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

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

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

Спасибо!

+3

Добавить свойство в файл 'application.properties'. 'spring.jpa.properties.javax.persistence.validation.mode = none' должен сделать трюк. –

+0

Работал отлично, спасибо. Это упоминается в любой весенней документации? –

+0

Как установить дополнительные свойства JPA, описано в справочном руководстве. –

ответ

17

As [M. Deinum] упоминается в комментарии к моей должности, решение установить:

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

В файле application.properties.

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

Смежные вопросы