У меня есть проект загрузки 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) какие части мне нужно настроить и как?
Спасибо!