【问题标题】:Consider defining a bean of type 'com.repository.UserRepository' in your configuration考虑在你的配置中定义一个 'com.repository.UserRepository' 类型的 bean
【发布时间】:2019-02-05 16:31:21
【问题描述】:

您好,我在 Spring Boot 中使用 Java 配置进行 JPA 和 Hibernate 配置,我在这个错误中停留了几个小时。 即使我已将 UserRepository 声明为 bean,它仍然无法获取存储库。

package com.repository;

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

我正在使用此存储库的服务类:

package com.service;

@Service
public class AppointmentPaymentServiceImpl implements AppointmentPaymentService {

@Autowired
private UserRepository userRepository;
......
......
}

我的数据库配置:

package com.config;

@Configuration
@PropertySource(value = { "classpath:application.properties" })
@EnableTransactionManagement
@EnableJpaRepositories("com.repository.*")
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
public class DBConfig {

@Value("${spring.datasource.driver-class-name}")
public String driver;

@Value("${spring.datasource.url}")
public String url;

@Value("${spring.datasource.username}")
public String username;

@Value("${spring.datasource.password}")
public String password;

@Value("${spring.jpa.properties.hibernate.dialect}")
public String dialect;

@Value("${spring.jpa.hibernate.ddl-auto}")
public String ddl;

@Bean(name = "dataSource")
public DriverManagerDataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);

    return dataSource;
}


@Bean(name = "sessionFactory")
public LocalSessionFactoryBean hibernateSessionFactory(DataSource dataSource) {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan(new String[] { "com.model.*" });
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
}


@Bean
HibernateTransactionManager transactionManagerHib(SessionFactory sessionFactory) {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory);
    return transactionManager;
}

/*@Bean
@Qualifier(value = "entityManager")
public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
    return entityManagerFactory.createEntityManager();
}*/

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

@Bean
 public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
 vendorAdapter.setDatabase(Database.MYSQL);
 vendorAdapter.setGenerateDdl(true);

 LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
 em.setDataSource(dataSource());
 em.setPackagesToScan("com.model.*");
em.setJpaVendorAdapter(vendorAdapter);
 em.setJpaProperties(hibernateProperties());

 return em;
}

@Bean
 public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
 JpaTransactionManager transactionManager = new JpaTransactionManager();
 transactionManager.setEntityManagerFactory(emf);

 return transactionManager;
}

Properties hibernateProperties() {
    return new Properties() {
        {
            setProperty("hibernate.hbm2ddl.auto", ddl);
            setProperty("hibernate.connection.useUnicode", "true");
            setProperty("spring.jpa.hibernate.ddl-auto", ddl);
            setProperty("hibernate.dialect", dialect);
            setProperty("spring.jpa.properties.hibernate.dialect", dialect);
            setProperty("hibernate.globally_quoted_identifiers", "true");
            setProperty("hibernate.connection.CharSet", "utf8mb4");
            setProperty("hibernate.connection.characterEncoding", "utf8");

        }
    };
}

}

这是我的主要课程:

package com; 

@SpringBootApplication
@ComponentScan(basePackages = { "com.*"})
@EnableCaching
@Configuration
@PropertySource({"classpath:logging.properties"})
public class MainApplication {

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

}

如果我只使用 spring data jpa,那么我的 pom.xml 包含 hibernate 和 jpa 的这些依赖项,那么默认情况下会导入我不想要的 hibernate-core 5.0.12.Final:

  <dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
    </dependency>
    .
    .
    .
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.10.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.3.Final</version>
    </dependency>
  </dependencies>

错误:

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

Description:

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


Action:

Consider defining a bean of type 'com.repository.UserRepository' in your configuration.

我的用户实体:

package com.model;

@Entity
@Table(name = "USER")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
@Column(name = "id")
private Long id;

@NotNull
@Column(name = "city_id")
private Long cityId;

@Column(name = "name")
private String name;

@Column(name = "age")
private int age;

@Column(name = "locality")
private String locality;

@Column(name = "gender")
private String gender;

}

【问题讨论】:

  • 简答:不要在你的包规范中使用.*
  • 是的,我尝试过这种方式,但随后出现此错误---> 原因:java.lang.IllegalArgumentException:不是托管类型:com..model.User @chrylis 类
  • '@Entity` 注释是来自javax.... 的注释,而不是来自 Hibernatate 的注释,对吧? (不确定它是否仍然存在,但最好检查一下)。
  • Spring Data Repositories 上不需要@Repository
  • 将@Service注解添加到你的UserRepository接口。

标签: java hibernate spring-boot spring-data-jpa


【解决方案1】:

在主 Spring Boot 应用程序类中添加以下注释解决了我的问题:

@ComponentScan("com.myapp.repositories")

【讨论】:

  • @Repositories 不应该在 Spring boot 中默认创建一个 Bean 吗?
【解决方案2】:

您的@EnableJpaRepositories 注释错误。您无需以这种方式定义存储库所在的包。

假设它们所在的包被调用:

foo.somepackage.repositories 那么你的注解应该是@EnableJpaRepositories("foo.somepackage.repositories")

尝试更正注释,以便正确和正确地扫描您的存储库包,以便将它们带入上下文。

【讨论】:

  • 是的,我尝试过这种方式,但随后出现此错误---> 原因:java.lang.IllegalArgumentException:不是托管类型:com..model.User @Aris_Kortex 类
  • 实际上是废弃了最后一条评论。问题与您指示实体管理器扫描包的方式有关。只需在其中丢失 .* 并放入完整的包路径。
  • 是的,我也通过从 entityManagerFactory Bean 中删除 .* 来尝试过这个错误-->原因:org.hibernate.MappingException:找不到组件属性:id
  • 我的用户类也是用@Entity 注释声明的,它不包含任何嵌入对象。
  • 我也多次删除了.m2文件夹,但还是不行。
【解决方案3】:

我认为您的代码必须在com.xyz.abc.model 下组织,@EnableJpaRepostiories 应该可以工作。 例如:com.xyz.abc.repositorycom.xyz.abc.service

【讨论】:

    【解决方案4】:

    只需将AppointmentPaymentServiceImplUserRepository 放在同一个包中,对我来说是com.

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题。我刚刚将存储库从我的工作项目复制到一个新项目,我得到了同样的错误考虑定义一个 com.[packagename].repository.[repository-name] 类型的 bean。上面没有对我有用,后来我做了以下事情:

      1. 去除了POM文件中JPA依赖的版本(只是去除了版本标签)

      2. 我使用的是 Java 15,当我从 start.spring.io 创建 SpringBoot 项目时,只有 11 和 16 个 fava 版本。所以我为我的项目选择了 11 个。我也在 POM 文件中更改了它

        15(之前是 11)
      3. 现在我在我的主文件中删除了@ComponentScan 注释,这也是我早期工作的解决方案。

      4. 只需使缓存无效并重新启动

      5. 键入 mvn clean install

      6. mvn clean spring-boot:run 希望这对你也有用

      【讨论】:

        猜你喜欢
        • 2018-06-22
        • 1970-01-01
        • 2020-08-01
        • 2019-02-14
        • 2018-12-21
        • 2019-05-10
        • 2019-09-04
        • 2020-05-23
        • 1970-01-01
        相关资源
        最近更新 更多