简体   繁体   English

找不到MongoRepository的bean(Spring Boot)

[英]could not found bean for MongoRepository (Spring Boot)

I am using spring boot and MongoDB . 我使用的是spring bootMongoDB

Spring version : 4.3.9

Spring boot version : 1.5.4

I am creating a repository which implements MongoRepository interface , like below 我正在创建一个实现MongoRepository interface的存储库,如下所示

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface HotelRepository extends MongoRepository<Hotel,String> {
}

But, whenever I am adding a dependency to HotelRepository compiler giving the error Field hotelRepository in com.demo.HotelController required a bean of type 'com.demo.HotelRepository' that could not be found. 但是,每当我向HotelRepository编译器添加依赖项时,在com.demo.HotelController中提供错误Field hotelRepository in com.demo.HotelController required a bean of type 'com.demo.HotelRepository' that could not be found.

@RestController
@RequestMapping("/hotel")
public class HotelController {

    @Autowired
    private HotelRepository hotelRepository;

    @GetMapping("/all")
    public List<Hotel> getAllHotels(){
        return this.hotelRepository.findAll();
    }
}

I've examine all the aspects from my side to resolve the error but all in vain. 我已经检查了我身边的所有方面来解决错误,但都是徒劳的。 What I've R&D. 我研发的是什么。

  • For HotelRepository there will be a default implementation provided out of the box. 对于HotelRepository ,将提供开箱即用的默认实现。 as per spring docs 按照春季文档
  • I've annotated the interface with @Repository , so no need to put @Component 我用@Repository注释了接口,所以不需要放@Component
  • Adding dependency from spring context using @Autowired annotation, So it should pick created bean from spring context. 使用@Autowired注释从spring上下文添加依赖项,因此它应该从spring上下文中选择创建的bean。
  • All the required files are in the same package, so no need to put @ComponentScan 所有必需的文件都在同一个包中,因此不需要放置@ComponentScan

Here is my main spring boot application class : 这是我的主要春季启动应用程序类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MongoWithBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(MongoWithBootApplication.class, args);
    }
}

application.properties : application.properties:

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=HotelDB

Stack trace : 堆栈跟踪

2017-07-10 13:25:12.485  INFO 4712 --- [           main] com.demo.MongoWithBootApplication        : Starting MongoWithBootApplication on KELLGGNCPU0313 with PID 4712 (D:\STS_WS\MongoWithBoot\target\classes started by mehrajuddin.malik in D:\STS_WS\MongoWithBoot)
2017-07-10 13:25:12.487  INFO 4712 --- [           main] com.demo.MongoWithBootApplication        : No active profile set, falling back to default profiles: default
2017-07-10 13:25:12.519  INFO 4712 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@13acb0d1: startup date [Mon Jul 10 13:25:12 IST 2017]; root of context hierarchy
2017-07-10 13:25:13.448  INFO 4712 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2017-07-10 13:25:13.456  INFO 4712 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2017-07-10 13:25:13.456  INFO 4712 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.15
2017-07-10 13:25:13.541  INFO 4712 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2017-07-10 13:25:13.541  INFO 4712 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1025 ms
2017-07-10 13:25:13.635  INFO 4712 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-07-10 13:25:13.637  INFO 4712 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-07-10 13:25:13.638  INFO 4712 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-07-10 13:25:13.638  INFO 4712 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-07-10 13:25:13.638  INFO 4712 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-07-10 13:25:13.673  WARN 4712 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hotelController': Unsatisfied dependency expressed through field 'hotelRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.demo.HotelRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
2017-07-10 13:25:13.675  INFO 4712 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2017-07-10 13:25:13.684  INFO 4712 --- [           main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-07-10 13:25:13.737 ERROR 4712 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field hotelRepository in com.demo.HotelController required a bean of type 'com.demo.HotelRepository' that could not be found.


Action:

Consider defining a bean of type 'com.demo.HotelRepository' in your configuration.

pom.xml : pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.demo</groupId>
    <artifactId>MongoWithBoot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>MongoWithBoot</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

Could someone please help me out here what am I missing? 有人可以帮帮我,我错过了什么?

Faced similar problem, Adding the following to Application class helped me resolving the problem 面对类似的问题,将以下内容添加到Application类帮助我解决了这个问题

@EnableMongoRepositories(basePackageClasses = DeviceDataRepository.class)

In your case it could be 在你的情况下它可能是

@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = HotelRepository.class)
public class MongoWithBootApplication{ ... }

I was facing the same problem 我遇到了同样的问题

Used below code to scan mongorepository packages 在代码下方用于扫描mongorepository包

@SpringBootApplication                                                       
@EnableMongoRepositories(basePackages = {"//packages you want to scan for activiting mongo repositories"})
public class SpringBootMongoDBApp{ ... }

It resolved my problem 它解决了我的问题

After so much of struggle, finally I've resolved the problem. 经过这么多的斗争,我终于解决了这个问题。

There is nothing wrong in the code or annotation. 代码或注释没有任何问题。 The problem was spring boot's version . 问题是spring boot的版本

However, I am still not sure what is the wrong in the version above 1.5.1.RELEASE .If anybody knows the root cause can edit or answer the question. 但是,我仍然不确定1.5.1.RELEASE以上版本中的错误。如果有人知道根本原因可以编辑或回答问题。

Problem : If I add spring-boot-starter-parent above 1.5.1.RELEASE , it gives me the above no bean error for MongoRepository . 问题 :如果我添加spring-boot-starter-parent上述1.5.1.RELEASE ,它给了我上面没有豆错误MongoRepository It gives error from 1.5.2 to 1.5.4 version. 它给出了从1.5.21.5.4版本的错误。 ( 1.5.4 was the last version till that I've tried and faced the no bean error) 1.5.4是最后一个版本,直到我尝试过并面临无bean错误)

Solution : It runs fine if I add spring-boot-starter-parent 1.5.1.RELEASE or below ( 1.5.0 was lowest version till I've tried). 解决方案 :如果我添加spring-boot-starter-parent 1.5.1.RELEASE或更低版本( 1.5.0是最低版本,直到我尝试过),它运行正常。

I have the same structure and I just had to add this configuration: 我有相同的结构,我只需添加此配置:

Application.java Application.java

@Configuration
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    ...
}

application.properties application.properties

spring.data.mongodb.uri=mongodb://localhost:27017/hotelDB

And the repository package have to be in a deeper level of Application.java class. 并且存储库包必须位于Application.java类的更深层次。 Thats all 就这样

com.hotelDB
    Application.java
    repository (Package)
    controller (Package)
    service (Package)
    ...

we need to activate mongo repositories using EnableMongoRepositories 我们需要使用EnableMongoRepositories激活mongo存储库

@SpringBootApplication
@EnableMongoRepositories //specify packages to scan
public class MongoWithBootApplication{ ... }

Just tried and did not found any problem at all with my existing spring boot mongodb project with 1.5.4.RELEASE for spring-boot-starter-parent . 刚试过,并没有发现任何问题与我现有的spring boot mongodb项目1.5.4.RELEASE for spring-boot-starter-parent

Earlier it was configured with 1.4.0.RELEASE . 之前它配置了1.4.0.RELEASE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM