当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Application无法从另一个模块注入Bean

南宫鸿晖
2023-03-14

我有以下3个模块在我的Spring启动应用程序:

  • web(入口点/主应用程序类,用@springbootplication
  • 坚持
  • 服务

我现在正试图在web模块中注入一个来自服务的服务。在这个服务中,我注入了来自持久性模块的存储库。启动应用程序时,会出现以下错误:

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

Description:

Parameter 0 of constructor in com.project.service.images.ImageService required a bean of type 'com.project.persistence.repositories.ImageRepository' that could not be found.


Action:

Consider defining a bean of type 'com.project.persistence.repositories.ImageRepository' in your configuration.

ImageService类:

package com.project.service.images;

import com.project.common.entities.Image;
import com.project.persistence.repositories.ImageRepository;
import com.project.service.AbstractService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.persistence.EntityNotFoundException;
import java.util.Date;
import java.util.List;

@Component
public class ImageService extends AbstractService {

    private final ImageRepository imageRepository;

    @Autowired
    public ImageService(ImageRepository imageRepository) {
        this.imageRepository = imageRepository;
    }

    public Image getImage(Long id) {
        return imageRepository.findById(id).orElseThrow(EntityNotFoundException::new);
    }

    public List<Image> getAll() {
        return imageRepository.findAll();
    }

    public List<Image> getAll(Date from) {
        return imageRepository.findByDateRange(from, null);
    }

    public List<Image> getAll(Date from, Date to) {
        return imageRepository.findByDateRange(from, to);
    }

    public List<Image> getAllForDay(Date day) {
        return imageRepository.findAll();
    }
}

ImageRepositoryclass:

package com.project.persistence.repositories;

import com.project.common.entities.Image;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

@Repository
public interface ImageRepository extends JpaRepository<Image, Long> {

    @Query("SELECT i FROM Image i WHERE i.created > :from AND i.created < :to")
    public List<Image> findByDateRange(@Param("from") Date from, @Param("to") Date to);
}

这就是我在web模块中将服务注入到我的类中的方式:

@Autowired
private ImageService imageService;

所以我在网上搜索,看到一些人有类似的问题。然后我得到了一个提示,我应该在我的应用程序类中将scanBasePackages添加到SpringBootApplication注释中。所以我做了这个:

package com.project.web;

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

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

但它仍然不起作用。如果我将特定的扫描包添加到注释com。项目服务images注入ImageService是可行的,但是它在其中找不到imagesrepository

我做错了什么?

我知道这么多模块对于这么小的应用程序来说没有意义,但我必须这么做,因为这是为了我的学徒期,我们需要制作多个模块。

共有3个答案

仲孙翔飞
2023-03-14

Spring无法扫描存储库类,因为它位于不同的包中。

根据你在评论中的回复,你的应用程序类在下面

通用域名格式。项目网状物

,因此默认情况下,Spring将扫描此包和子包下的所有类。因此,您需要将所有spring组件放在应用程序所在的同一个包/子包下。

琴俊良
2023-03-14

试着把scanBasePackages改成“com.project”。存储库位于另一个包中。

如:

@SpringBootApplication(scanBasePackages="com.project")

鲁烨
2023-03-14

通常应该做的是在应用程序中使用这种结构

app
   SpringBootApp.java
   app.repositories
       Repository.java
   app.services
       Service.java

如果您没有遵循该包结构,那么您需要

@EnableJpaRepositories

并注意可能存在相同问题的实体,在这种情况下,请查看:

@EntityScan
 类似资料:
  • 问题内容: 我有一个和一个。 我想用的。 当我通过注射添加时: 我得到这个嵌套错误: [嵌套] 11592-2018-8-13 11:42:17 [ExceptionHandler] Nest无法解析PlayersService(+,?)的依赖项。请确保索引[1]的参数在当前上下文中可用。 这两个模块均导入。两种服务都在其模块中单独工作。 问题答案: 你要 导出 的是它提供的模块: 然后将导出 模

  • 问题内容: 我有一个单独模块的工厂,我想将其注入模块的提供程序中,但是却不断收到未知的提供程序错误。我究竟做错了什么? 我想注入的是: 我试图注入的地方: 导致 问题答案: 我认为是因为所有提供程序都在工厂之前实例化,因此提供程序仅需依赖其他提供程序。 作为一种解决方法,我正在使用创建模块的方法。一个可以完成您想完成的任务的插件:http ://plnkr.co/edit/g1M7BIKJkjSx

  • 问题内容: 假设我有一个名为的软件包,其中包含: 和: 然后我执行以下脚本: 这是我的期望: 这是我得到的: 谁能解释我的误解? 问题答案: 您正在使用。在导入模块的全局范围(或​​发生import语句的任何范围)中成为符号。 当您为指定新值时,您也只是在更改哪些值点,而不是实际值。尝试直接使用in导入,并通过设置在那里进行实验。这样,您实际上将在此上下文中修改哪个是“实际”值。 它有点令人费解,

  • 如图,我将framework中的ResponseResult引入到blog中,然后在maven install命令下报错。 blog依赖了framework。是不是因为我两个模块的java下的包名一样导致的,如果是的话,该怎么改呢?

  • 我正在写一个应用程序使用Node.js.具体来说,我使用节点v10.3.0。此应用程序位于位于。此应用程序有一个package.json文件位于。这个应用程序引用了一个在中定义的类。需要注意的是表示自己的包。这个包是在中定义的。index.js代码如下: 当我尝试运行此操作时,会出现以下错误: 我的进口声明有什么问题?在我看来这是正确的。我是不是误解了什么? 项目js 谢谢