Реализация пользовательского метода в данных Spring с помощью MongoDB

#java #mongodb #spring-data-mongodb #mongotemplate

Вопрос:

Я пытаюсь использовать пользовательские методы с данными Spring и MongoDB. Когда я использую встроенные методы MongoRepository (например, findAll, save, insert и т. Д.), Он отлично работает с моей пользовательской реализацией для MongoRepositoryFactoryBean (ссылаясь на коллекцию custom_person, что ожидается), но когда я создаю свои пользовательские методы, такие как findByUniqueId, он работает не так, как ожидалось (он ссылается на коллекцию person вместо коллекции custom_person).

Вот моя реализация

Изготовленный на заказ MongoFactoryBean

 public class CustomMongoRepositoryFactoryBean extends MongoRepositoryFactoryBean {

  public CustomMongoRepositoryFactoryBean(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) {

        MongoPersistentEntity entity = operations.getConverter().getMappingContext()
            .getPersistentEntity(domainClass);

        return new MappingMongoEntityInformation<T, ID>(entity) {
          @Override
          public String getCollectionName() {
            String collectionName = entity.getCollection();
            String tenantId = "custom";
            return tenantId.concat("_").concat(collectionName);
          }
        };
      }

      @Override
      protected Object getTargetRepository(RepositoryInformation information) {

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

Файл MongoConfig

 @Configuration
@EnableMongoRepositories(basePackages = "com.custom.repository",
    repositoryFactoryBeanClass = CustomMongoRepositoryFactoryBean.class)
public class MongoConfig {

  @Value("${mongodb.database:test}")
  private String database;

  @Value("${mongodb.connectionString}")
  private String connectionString;

  @Bean
  public MongoClient mongoClient() {
    ConnectionString connectionString = new ConnectionString(this.connectionString);
    MongoClientSettings settings = MongoClientSettings.builder()
        .applyConnectionString(connectionString).build();
    return MongoClients.create(settings);
  }

  @Bean
  public MongoTemplate mongoTemplate() {
    return new MongoTemplate(this.mongoClient(), this.database);
  }
}
 

Person Class

 @Data
@org.springframework.data.mongodb.core.mapping.Document("person")
public class Person {

  @Id
  private String id;

  @Field("unique_id")
  private String uniqueId;

  @Field("first_name")
  private String firstName;

  @Field("last_name")
  private String lastName;
}
 

PersonRepository

 @Repository
public interface PersonRepository extends MongoRepository<Person, String> {

  Optional<Person> findByUniqueId(String uniqueId);

}
 

PersonServiceImp Class

 @Data
@Slf4j
@Service
public class PersonServiceImpl implements PersonService {
    @Autowired
    private PersonRepository personRepository;

    @Override
    public List<Person> getPerson() {
        List<Person> persons = personRepository.findAll();
        return persons;
    }

    public Optional<Person> getPerson(String uniqueId) {
        Optional<Person> opt = personRepository.findByUniqueId(uniqueId);
        if (opt.isPresent()) {
            return Optional.of(opt.get());
        } else {
            return Optional.empty();
        }
    }
}
 

Please suggest the solution.