SpringBoot не может найти хранилище Mongo - PullRequest
0 голосов
/ 18 мая 2018

У меня проблема с тем, что я пытаюсь добавить в базу данных вторую базу данных Монго.Я делаю это, добавляя второй MongoTemplate, который использует префикс конфигурации, а затем определенное имя bean-компонента.

У меня есть AbstractMongoConfig, такой как

public abstract class AbstractMongoConfig {
    private String uri;

    public void setUri(String uri) {
        this.uri = uri;
    }

    public MongoDbFactory mongoDbFactory() throws Exception {
        return new SimpleMongoDbFactory(new MongoClientURI(uri));
    }

    abstract public MongoTemplate getMongoTemplate() throws Exception;                                                                        }

, который я расширяю в конкретную конфигурацию шаблонавот так ... Чтобы добавить еще одну БД mongo, я бы добавил еще одну из них, а затем аннотировал различные репозитории для использования другой конфигурации через templateRef, верно?

@Configuration
@ConfigurationProperties(prefix="server.mongodb")
public class ServerMongoConfig extends AbstractMongoConfig {
    @Primary
    @Override
    @Bean(name="serverMongoTemplate")
    public MongoTemplate getMongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }
}

С этим я должен иметь возможностьположить конфиги, как server.mongodb.uri = ...

У меня есть репозиторий, который использует это

@Repository
public interface MAPRepository extends MongoRepository<MAP, String> {
    public List<MAP> findByName(String name);
}

И сущность

@Document(collection="maptest")
public class MAP {
    @Id
    private String id;
    private String name;
}

У меня тогда естькласс обслуживания, использующий этот репозиторий

@EnableMongoRepositories(mongoTemplateRef="serverMongoTemplate")
@Service
public class TestService {
    @Autowired
    @Qualifier(value = "serverMongoTemplate")
    private MAPRepository mrepo;

    ... use mrepo ...
}

Но при запуске я получаю сообщение об ошибке

Description:

Field mrepo in testpkg.svc.TestHandler required a bean of type 'testpkg.repo.MAPRepository' that could not be found.

Action:

Consider defining a bean of type 'testpkg.repo.MAPRepository' in your configuration.

и ниже ...

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'testpkg.repo.MAPRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=serverMongoTemplate)}

Сервисв другом пакете, чем хранилище, но я проверил импорт и все такое ... все это просто отлично.MAPRepository помечен @Repository, что означает, что он должен быть доступен в виде компонента, верно?

Что еще может происходить здесь, что приводит к тому, что компонент не видит компонент?Есть ли какой-нибудь класс, который я могу включить для отладки, чтобы выяснить, что происходит?

До того, как я добавил компонент ServerMongoConfig, он работал нормально.Он смог написать в эту БД без проблем.Просто сейчас он не может правильно его создать.

1 Ответ

0 голосов
/ 18 мая 2018

Ответ, по-видимому, заключается в том, что @EnableMongoRepositories должен иметь basePackages, который ссылается на правильный пакет, содержащий новый шаблон, в противном случае, я полагаю, mongoTemplateRef не сможет правильно его найти.

Итак, в службекласс:

@EnableMongoRepositories(basePackages={"testpkg.repo"}, mongoTemplateRef="serverMongoTemplate")

и все отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...