【问题标题】:Unable to detect the repository annotation in Spring Boot在 Spring Boot 中无法检测到存储库注释
【发布时间】:2020-01-20 03:54:19
【问题描述】:

我在包上有一个 Repository 类:

com.repository

我已经在 Spring Boot 的主类中定义了@ComponentScan("com.*")

但是在运行应用程序时我得到了异常

考虑定义一个“com.repository.TopicRepository”类型的bean 你的配置。

以下是类:

主题库

package com.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import com.models.Topic;


@Repository
public interface TopicRepository extends CrudRepository<Topic,String>{



}

应用程序

package com.example.springboot.springboot.test;

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

@SpringBootApplication(scanBasePackages = "com.*")
public class Application {

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

}

POM.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.3.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.springboot</groupId>
<artifactId>springboot.test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot.test</name>
<description>Demo project for Spring Boot</description>


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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<properties>
    <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>

我已经尝试过@ComponentScan。如果我将scanBasePackages 更改为"com.repository",那么它能够以某种方式拾取TopicRepository 以及其他Service and Controller,这不应该是这种情况,因为它们在不同的包下。

编辑:

包结构

com.models : 模型

com.repository : 存储库

com.services : 服务

com.controllers : 控制器

com.springboot.springboottest : 主类

【问题讨论】:

标签: java spring eclipse spring-boot


【解决方案1】:

来自documentation

我们通常建议您将主应用程序类定位在 其他类之上的根包。 @SpringBootApplication 注释通常放置在您的主类上,并且 它是隐式的 为某些项目定义了一个基本的“搜索包”

正如 chrylis -on strike 在评论中指出的那样,基本包应该被定义为 com 。扫描将从包 com 及其所有子包开始

@ComponentScan("com")

更新

基于共享的包结构。

@SpringBootApplication(scanBasePackages = {"com.models","com.repository","com.services","com.controllers"})
public class Application {

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

}

@SpringBootApplication(scanBasePackages = "com")
public class Application {

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

}

应该可以。

最好的选择是将类 Application 移动到包 com 具有以下注释。

@SpringBootApplication
public class Application {

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

}

【讨论】:

  • 没有还是同样的问题
  • 您确实提到,当“scanBasePackages”被修改时,它起作用了。你修改了什么,最新的错误是什么?
  • @RG,我修改为包含像 scanBasePackages("com.repository") 这样的包。它启动了应用程序,但控制器和服务没有被拾取,因为它们位于不同的包中。目前我遇到了与问题中定义的相同的错误
  • @ghostrider 您可以将多个包添加到组件扫描中:例如:@ComponentScan({“package1”,”package2”})。同时添加“com”应该理想地扫描所有子包并检测组件
  • @SpringBootApplication 也是如此
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2015-10-06
  • 2020-09-19
相关资源
最近更新 更多