Как указать имя коллекции при использовании Spring Data Mongo? - PullRequest
1 голос
/ 06 июня 2019

Я использую данные пружины для извлечения данных для моего приложения.

В классе репозитория используется класс сущностей mongo, который добавляется в качестве исходной зависимости к моему проекту, что означает, что у меня нет никакого контроля над изменением исходного кода класса.В результате я не могу использовать аннотацию @Document из org.springframework.data.mongodb.core.mapping для моего класса сущности mongo.

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface DummyRepository extends MongoRepository<Dummy, String> {

    Page<Dummy> findAll(Pageable pageable);

}

Здесь я не имею никакого контроля над исходным кодом класса Dummy, поэтомуЯ не могу добавить @Document, чтобы указать имя коллекции для этого класса

Как указать имя коллекции при использовании DummyRepository для запроса коллекции монго?

1 Ответ

1 голос
/ 07 июня 2019

Одним из способов было бы использование @EnableMongoRepositories#repositoryFactoryBeanClass с вашим собственным видом переопределения MongoRepsoitoryFactoryBean getEntityInformation(Class).
К сожалению, в коде и на данный момент есть ошибка ( DATAMONGO-2297 )Вам также необходимо настроить getTargetRepsoitory(RepositoryInformation), как показано в фрагменте ниже.

@Configuration
@EnableMongoRepositories(repositoryFactoryBeanClass = CustomRepoFactory.class)
class config extends AbstractMongoConfiguration {
  // ...
}

class CustomRepoFactory extends MongoRepositoryFactoryBean {

  public CustomRepoFactory(Class repositoryInterface) {
    super(repositoryInterface);
  }

  @Override
  protected RepositoryFactorySupport getFactoryInstance(MongoOperations operations) {

    return new MongoRepositoryFactory(operations) {

      @Override
      public <T, ID> MongoEntityInformation<T, ID> getEntityInformation(Class<T> domainClass) {

       return new MappingMongoEntityInformation(
            operations.getConverter().getMappingContext().getPersistentEntity(domainClass)) {

          @Override
          public String getCollectionName() {
            return "customize-as-you-wish";
          }
        };
      }

      @Override // you should not need this when DATAMONGO-2297 is resolved
      protected Object getTargetRepository(RepositoryInformation information) {

        MongoEntityInformation<?, Serializable> entityInformation = getEntityInformation(information.getDomainType());
        return getTargetRepositoryViaReflection(information, entityInformation, operations);
      }
    };
  }
}
...