#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.