【问题标题】:Spring WebMVC with Couchbase service - No bean named 'couchbaseRepositoryOperationsMapping' available带有 Couchbase 服务的 Spring WebMVC - 没有名为“couchbaseRepositoryOperationsMapping”的 bean 可用
【发布时间】:2019-10-30 05:20:11
【问题描述】:

我正在使用 thymeleaf 创建一个简单的 Spring WebMVC 应用程序,现在我想添加一个服务来提供到 couchbase 服务器的连接。

我尝试根据以下教程Couchbase with Spring-Boot and Spring Data创建couchbase服务

我的项目结构如下:

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

在尝试自动装配服务时,我得到一个异常,即没有名为 couchbaseRepositoryOperationsMapping 的 bean,这是因为我的存储库类扩展了 CouchbasePagingAndSortingRepository,这引发了异常。

我得到以下异常:

[main] 信息 org.springframework.web.servlet.DispatcherServlet - 初始化 Servlet 'dispatcher' [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - 发现多个 Spring Data 模块,进入严格的存储库配置模式! [主要] 信息 org.springframework.data.repository.config.RepositoryConfigurationDelegate - 在默认模式下引导 Spring Data 存储库。 [主] 信息 org.springframework.data.repository.config.RepositoryConfigurationDelegate - 在 64 毫秒内完成 Spring 数据存储库扫描。找到 1 个存储库接口。 [主要] 警告 org.springframework.web.context.support.AnnotationConfigWebApplicationContext - 上下文初始化期间遇到异常 - 取消刷新尝试: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“buildingServiceImpl”的 bean 时出错:不满意 通过字段“buildingRepository”表达的依赖关系;嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建名为“buildingRepository”的 bean 时出错: “buildingRepository”取决于缺少的 bean 'couchbaseRepositoryOperationsMapping';嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 名为“couchbaseRepositoryOperationsMapping”的 bean 可用 [main] 错误 org.springframework.web.servlet.DispatcherServlet - 上下文 初始化失败 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“buildingServiceImpl”的 bean 时出错:不满意 通过字段“buildingRepository”表达的依赖关系;嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建名为“buildingRepository”的 bean 时出错: “buildingRepository”取决于缺少的 bean 'couchbaseRepositoryOperationsMapping';嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 名为“couchbaseRepositoryOperationsMapping”的 bean 可用

据我了解,它不起作用,因为没有 bean 命名为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>

****更新****

添加一个 CouchbaseConfig 类解决了 couchbaseRepositoryOperationsMapping 的问题,但我现在得到另一个错误,即现在名为 bean buildingRepository。所有课程均基于教程Couchbase with Spring-Boot and Spring Data。我是否错过了注释,因此 spring 无法自动装配类?

我的存储库类:

@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);
    }

}

【问题讨论】:

  • 你可以在这里发布你的配置类吗?
  • 你还没有声明 couchbase 配置?服务器用户密码 !!!!

标签: java spring spring-mvc spring-data couchbase


【解决方案1】:

你错过了配置类 couchebase 服务器

为您的 couhcebase 创建一个扩展 AbstractCouchbaseConfiguration 的专用配置类,如下所示(服务器 @、用户、密码)

@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"),以便扫描您的存储库接口和服务

【讨论】:

  • 谢谢,它成功了,但现在我又遇到了一个异常。 No qualifying bean of type 'com.xplorg.model.BuildingRepository' available: expected at least 1 bean which qualifies as autowire candidate. 我有一个名为 BuildingRepository 的 bean,它基于教程 Couchbase with Spring-Boot and Spring Data
  • 我认为它来自 @ComponentScan("com.xplorg.controller") ;在 mvc 配置中将其更改为 @ComponentScan("com.xplorg")
  • @Xplorg 你不客气我很高兴 :)
猜你喜欢
  • 2018-02-21
  • 2020-12-02
  • 2019-03-16
  • 2021-07-08
  • 2015-04-26
  • 2018-10-14
  • 2021-03-18
  • 2020-03-21
  • 2018-11-16
相关资源
最近更新 更多