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

Как я могу получить Spring -Data-MongoDB для проверки моих объектов?

У меня очень простое приложение загрузки Spring, которое использует Spring -Data-Mongodb

Все, что я хочу сделать, это установить правило проверки JSR-303, в котором говорится, что объект, который я сохраняю, должен иметь имя пользователя. Я прочитал, что JSR-303 был добавлен в Spring -data-mongodb в версии 1.1, поэтому я предположил, что когда я сохраняю объект, он проверяется, но это не так.

У кого-нибудь есть простая примерная установка, которая показывает, как это работает?

Мое User pojo выглядит как

public class User {

    @Id
    private String id;

    @NotNull(message = "User Name is compulsory")
    private String userName;
    private String password;

    public User() {}

    public String getId() {
      return id;
    }
    public void setId(String id) {
      this.id = id;
    }

    public String getUserName() {
      return userName;
    }
    public void setUserName(String userName) {
      this.userName = userName;
    }


    public String getPassword() {
      return password;
    }
    public void setPassword(String password) {
      this.password = PasswordAuthService.hash(password);
    }
}

Я видел где-то, что проверка выполняется только в том случае, если у вас есть валидатор, созданный в контексте, поэтому я попробовал обновить свой класс приложения (который содержит всю конфигурацию, чтобы выглядеть как

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    @Bean
    public Validator getValidator() {
      LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
      return validator;
    }

    public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
    }

}
4b9b3361

Ответ 1

Сначала убедитесь, что у вас есть валидатор JSR-303 в пути к классам, например:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.2.0.Final</version>
</dependency>

Если вы используете конфигурацию Java, то вам нужно создать 2 beans:

@Bean
public ValidatingMongoEventListener validatingMongoEventListener() {
    return new ValidatingMongoEventListener(validator());
}

@Bean
public LocalValidatorFactoryBean validator() {
    return new LocalValidatorFactoryBean();
}

Вуаля! Теперь валидация работает.

Ответ 2

Я обнаружил, что если добавить

public User addUser(@RequestBody  @Valid User newUser, 
                   BindingResult bindingResult) throws Exception {

  if (bindingResult.hasErrors()) {
    throw new Exception("Validation Error");
  }

К моему контроллеру это проверяет входящий json на мои правила, хотя я все же должен попытаться настроить validatingMongoEventListener для перехвата любых других частей моего кода, которые пытаются обновить модель с недопустимыми данными.

Ответ 3

Добавление Validator в контекст является хорошим первым шагом, но я не думаю, что он будет взаимодействовать с чем угодно, если вы не попросите его об этом. Ребята из Spring Data могут, вероятно, сказать наверняка, но я думаю, вам нужно явно объявить некоторых слушателей. Там старый блог об этой функции, но вы можете найти, что по googling так легко, как я могу.

Если вы считаете, что в Spring Boot будет полезная функция autoconfig, не стесняйтесь делать подробное предложение по github.