Сделайте поле в абстрактном классе обязательным, сохраняя при этом конкретный объект класса в БД - PullRequest
0 голосов
/ 29 апреля 2020
public abstract class Parent{
  @NotNull
  private String appId;
}

@Documnet
public class child1 extends Parent{
  @Id
  private String id;
  ...more fields
  ...getters setters
}

@Documnet
public class child2 extends Parent{
  @Id
  private String id;
  ...more fields
  ...getters setters
}

Я хочу убедиться, что каждый раз, когда я сохраняю значение Child1 или Child2 в поле appId mongodb, имеет допустимое значение, в противном случае я хочу, чтобы мой код выдавал какое-то исключение или ошибку.

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

Я использую spring-boot и mongodb в качестве базы данных.

ependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation 'io.springfox:springfox-swagger2:2.9.2'
  implementation 'io.springfox:springfox-swagger-ui:2.0.1'
  implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'

  testImplementation 'org.springframework.boot:spring-boot-starter-test'

  compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '2.2.6.RELEASE'
  compile('org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.0.6.RELEASE')
  compile('org.glassfish.jaxb:jaxb-runtime:2.3.1')

  compileOnly "org.projectlombok:lombok:${lombokVersion}"
  annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
}

1 Ответ

0 голосов
/ 29 апреля 2020

Вот как я решил эту проблему, Не уверен, что это конкретное решение

public abstract class Parent {
    @NotNull
    private String appId;
}

@Document
public class Child extends Parent{

    @Id
    private String id;

}

создать бины для ValidatingMongoEventListener и LocalValidatorFactoryBean

@Configuration
public class SomeClass {

    @Bean
    public ValidatingMongoEventListener createValidatingMongoEventListenerBean(LocalValidatorFactoryBean localValidatorFactoryBean){
            return  new ValidatingMongoEventListener(localValidatorFactoryBean);
    }

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

}

теперь, если мы попытаемся сохранить дочерний класс, который расширяет наш родительский класс без appId , он выдаст ConstraintViolationException

...