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

Spring在服务中使用组件扫描字段userRepository配置bean。UserService需要类型为“repository”的bean

扈阳辉
2023-03-14

我检查了许多例子,但它们通常是关于用@Repository或@Service等标记类...例如,这里是关于要扫描的包,我不确定我应该在哪里以及以哪种方法进行扫描。

我有一个简单的应用程序和一个用户模型,UserRepository扩展了JPA存储库和一个服务。当我尝试连接数据库时,默认设置是可以的,但每当我想使用自定义配置时,程序就找不到UserRepository类,即使我将其标记为@Repository。程序仍然需要存储库类配置bean。

以下是我的服务方法:

@Service
public class UserService {
    @Autowired
    UserRepository userRepository;
    public User findById(Long id) {
        return userRepository.findById(id).get();
    }
}

该模型是:

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;
    private Date birthday;
}

用户存储库类:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

以下是我试图实现的配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "transactionManager")
public class UserDbConfig {
    
    @Primary
    @Bean("dataSource")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/testSchema");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }
    
    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("dataSource") DataSource dataSource
    ) {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.practice.multiDatabase.model");
        factory.setDataSource(dataSource());
        return factory;
    }
    
    @Bean("transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {

        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory);
        return txManager;
    }
}

输出为:

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

Description:

Field userRepository in com.practice.multiDatabase.service.UserService required a bean of type 'com.practice.multiDatabase.repository.UserRepository' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.practice.multiDatabase.repository.UserRepository' in your configuration.

额外说明:每当我将此添加到main方法时

@SpringBootApplication(scanBasePackages = {
        "com.practice.multiDatabase.repository",
        "com.practice.multiDatabase.controller",
        "com.practice.multiDatabase.service",
        //"com.practice.multiDatabase.config"
        //, "com.practice.multiDatabase.model"
})
public class MultiDatabaseApplication {

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

}

程序正在工作,但可能忽略了配置文件,因为我已经显式地编写了controller服务存储库,如果我也取消了对配置文件夹的注释,那么仍然会出现相同的错误

共有1个答案

严扬
2023-03-14

我认为您错过了要创建的存储库的另一个重要注释。

@EntityScan({"com.practice.multiDatabase.model"})

然后可以找到您的实体模型,并成功创建您的存储库!

 类似资料:
  • 我找不到关于beans xml配置的文档,所以我在这里问:在 在概念上与Java中的包相同吗? 例如,在我的src/main/java(Eclipse中的项目资源管理器视图,平面包演示)中,假设我有4个包com.amazon、com.amazon.entities、com.amazon.services、com.amazon.repositories.在Navigator视图中,我只有“amazo

  • 我是一名spring boot学习者,所以我一直在尝试创建一些基本的spring boot应用程序。我试图运行开发的应用程序时出错。 我的错误是[[https://i.stack.imgur.com/oyQDi.png][1]][1] java: ItemDetails.java:[软件包名称:io.ajithan.springbootstarter.model] ItemResponse.jav

  • 结构没有问题。spring boot可以扫描UserMapper,但不能扫描UserService。我试着给我的UserService@Mapper组件,然后它就可以被扫描了。但我不知道如何使用其他方法进行扫描。我尝试了@服务,但不起作用。

  • 我在尝试运行我的应用程序时遇到以下错误: com.alon.service.EmployeeServiceImpl中得字段edao需要类型为“com.alon.Repository.EmployeeRepository”得bean,但找不到该bean. 注入点有以下注释: null EmployeeServiceImpl: 我的应用程序:

  • 在另一个项目中实现之前,我一直试图按照这里的教程设置演示,以帮助我理解本地机器上的SSO。我遇到了一个使我陷入困境的问题。我收到错误通知我添加一个bean。请让我知道我缺少了什么代码。我无法使程序运行。 文件系统树 authApplication.java 应用程序.属性 给出错误(不是运行的全部控制台输出,但这是错误)

  • 我有一个java项目,它将Spring Boot与JPA结合使用,并将Hibernate用于数据库。我正在尝试建立一个访问数据库的微服务。(我不熟悉微服务和Spring Boot)。 以下是主要课程: IGmCircularsDAO. class: GMCircularsDAOImpl。类别: ParentDAO。班 循环服务。班 当我运行这段代码时,我遇到了以下错误,我已经陷入其中一段时间了。