Spring WebMVC с сервисом Couchbase - недоступен компонент с именем couchbaseRepositoryOperationsMapping - PullRequest
3 голосов
/ 16 июня 2019

Я создаю простое приложение Spring WebMVC с помощью thymeleaf, и теперь я хочу добавить службу, которая обеспечивает соединение с couchbase сервером.

Я пытался создать сервис couchbase на основе следующего урока Couchbase с данными Spring-Boot и Spring

У меня следующая структура проекта:

src/main/java
    com.project
        config
            MvcWebApplicationInitializer
            MvcWebConfig
        controller
            IndexController
        model
            Area
            Building
            BuildingRepository
            BuildingService
            BuildingServiceImpl

При попытке автоматической передачи службы я получаю исключение, что не существует bean-компонента с именем couchbaseRepositoryOperationsMapping, что происходит потому, что мой класс хранилища расширяет CouchbasePagingAndSortingRepository, который выдает исключение.

Я получаю следующее исключение:

[главная] ИНФОРМАЦИЯ org.springframework.web.servlet.DispatcherServlet - Инициализация сервлета 'диспетчер' [основная] информация org.springframework.data.repository.config.RepositoryConfigurationDelegate - Найдено несколько модулей Spring Data, входящих в режим строгой конфигурации хранилища! [главная] ИНФОРМАЦИЯ org.springframework.data.repository.config.RepositoryConfigurationDelegate - Начальная загрузка репозиториев Spring Data в режиме DEFAULT. [main] ИНФОРМАЦИЯ org.springframework.data.repository.config.RepositoryConfigurationDelegate - Завершено сканирование репозитория Spring Data за 64 мс. Найдено 1 интерфейс хранилища. [главная] ВНИМАНИЕ org.springframework.web.context.support.AnnotationConfigWebApplicationContext - Возникла исключительная ситуация во время инициализации контекста - Отмена попытки обновления: org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания бина с именем buildingServiceImpl: неудовлетворен зависимость выражается через поле buildingRepository; вложенными Исключением является org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем buildingRepository: 'buildingRepository' зависит от отсутствующего компонента 'CouchbaseRepositoryOperationsMapping'; вложенное исключение org.springframework.beans.factory.NoSuchBeanDefinitionException: нет бин с именем 'couchbaseRepositoryOperationsMapping' доступен [основной] ОШИБКА org.springframework.web.servlet.DispatcherServlet - Context Ошибка инициализации org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания бина с именем buildingServiceImpl: неудовлетворен зависимость выражается через поле buildingRepository; вложенными Исключением является org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем buildingRepository: 'buildingRepository' зависит от отсутствующего компонента 'CouchbaseRepositoryOperationsMapping'; вложенное исключение org.springframework.beans.factory.NoSuchBeanDefinitionException: нет бин с именем 'couchbaseRepositoryOperationsMapping' доступен

Насколько я понимаю, это не работает, потому что нет бобов по имени couchbaseRepositoryOperationsMapping.

Мой MvcWebConfig:

@Configuration
@EnableWebMvc
@ComponentScan("com.xplorg.controller")
@EnableCouchbaseRepositories(basePackages = {"com.xplorg.model"})
public class MvcWebConfig implements WebMvcConfigurer {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }

    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        registry.viewResolver(viewResolver);
    }

    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

}

Мой pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.project</groupId>
  <artifactId>xplorg</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>Project</name>
  <properties>
    <failOnMissingWebXml>false</failOnMissingWebXml>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
  </properties>
  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>bootstrap</artifactId>
        <version>3.3.7-1</version>
    </dependency>
    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>jquery</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-couchbase</artifactId>
        <version>3.1.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0.2</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.4.18.v20190429</version>
        </plugin>
    </plugins>
  </build>
</project>

**** ***** Update 1034 *

Добавление класса CouchbaseConfig устранило проблему с couchbaseRepositoryOperationsMapping, но теперь я получаю еще одну ошибку, которая теперь называется bean buildingRepository. Все классы основаны на учебнике Couchbase с Spring-Boot и Spring Data . Я пропускаю аннотации и, следовательно, весна не может автоматически связать класс?

Мой класс хранилища:

@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "building")
public interface BuildingRepository extends CouchbasePagingAndSortingRepository<Building, String> {

    List<Building> findByCompanyId(String companyId);

    Page<Building> findByCompanyIdAndNameLikeOrderByName(String companyId, String name, Pageable pageable);

    @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and companyId = $1 and $2 within #{#n1ql.bucket}")
    Building findByCompanyAndAreaId(String companyId, String areaId);

    @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} AND ANY phone IN phoneNumbers SATISFIES phone = $1 END")
    List<Building> findByPhoneNumber(String telephoneNumber);

    @Query("SELECT COUNT(*) AS count FROM #{#n1ql.bucket} WHERE #{#n1ql.filter} and companyId = $1")
    Long countBuildings(String companyId);
}

Мой класс обслуживания:

@Service
public class BuildingServiceImpl implements BuildingService {

    @Autowired
    private BuildingRepository buildingRepository;

    @Override
    public List<Building> findByCompanyId(String companyId) {
        return buildingRepository.findByCompanyId(companyId);
    }

    public List<Building> findByCompanyIdAndNameLike(String companyId, String name, int page) {
        return buildingRepository.findByCompanyIdAndNameLikeOrderByName(companyId, name, new PageRequest(page, 20))
                .getContent();
    }

    @Override
    public Building findByCompanyAndAreaId(String companyId, String areaId) {
        return buildingRepository.findByCompanyAndAreaId(companyId, areaId);
    }

    @Override
    public List<Building> findByPhoneNumber(String telephoneNumber) {
        return buildingRepository.findByPhoneNumber(telephoneNumber);
    }

    @Override
    public Building findById(String buildingId) {
        return buildingRepository.findById(buildingId).get();
    }

    @Override
    public Building save(Building building) {
        return buildingRepository.save(building);
    }

    @Override
    public Long countBuildings(String companyId) {
        return buildingRepository.countBuildings(companyId);
    }

}

1 Ответ

2 голосов
/ 16 июня 2019

Вы пропустили сервер конфигурации класса couchebase

Создайте отдельный класс конфигурации, расширяющий AbstractCouchbaseConfiguration для вашей базы данных, как показано ниже (server @, user, pwd)

@Configuration
@EnableCouchbaseRepositories(basePackages = {"com.xplorg.model"})
public class CouchbaseConfig extends AbstractCouchbaseConfiguration {

    @Override
    protected List<String> getBootstrapHosts() {
        return Arrays.asList("your server ip (like localhost in local)");
    }

    @Override
    protected String getBucketName() {
        return "username";
    }

    @Override
    protected String getBucketPassword() {
        return "passsword";
    }
}

также измените @ComponentScan("com.xplorg.controller") на @ComponentScan("com.xplorg") в конфигурации вашего проекта, так что интерфейс и служба вашего хранилища должны быть отсканированы

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