【问题标题】:Why can't Service find my Repository bean?为什么服务找不到我的存储库 bean?
【发布时间】:2019-01-20 00:09:18
【问题描述】:

我正在制作一个简单的 Spring Boot 应用程序,但由于某种原因,我的服务似乎没有注意到我的存储库 bean。我检查了我的配置,看起来还不错,我基本上也只是复制了从教程中注入存储库的方式,所以我什至不知道问题出在哪里。

我的仓库:

@Repository
public interface ProjectRepository extends CrudRepository<Trucks, Integer> 
{

@Query("....")
List<Trucks> getTrucks();
}

我的服务:

@Service
@Transactional
public class ProjectServiceImpl implements ProjectService {


private ProjectRepository projectRepository;

@Autowired
public ProjectServiceImpl(ProjectRepository projectRepository) {
    this.projectRepository = projectRepository;
}

@Override
public List<Trucks> getTrucks() {
    return projectRepository.getTrucks();
}
}

配置:

@Configuration
@EnableJpaRepositories(basePackages = {
    "com.javar.domain"
})
@PropertySource("classpath:application.properties")
@EnableTransactionManagement
public class PersistanceContext {

private static final String[] ENTITY_PACKAGES = {
        "com.javar.domain"
};
private static final String PROPERTY_NAME_DB_DRIVER_CLASS 
="spring.datasource.driver-class-name";
private String PROPERTY_NAME_DB_URL="app.datasource.url";
private String PROPERTY_NAME_DB_USER="app.datasource.username";
private String PROPERTY_NAME_DB_PASSWORD="app.datasource.password";
private String 
PROPERTY_NAME_HIBERNATE_DIALECT="spring.jpa.properties.hibernate.dialect";
private String 
PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO="spring.jpa.hibernate.ddl-auto";
private String 
PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY="spring.jpa.hibernate.naming- 
strategy";
private String PROPERTY_NAME_HIBERNATE_SHOW_SQL="spring.jpa.show-sql";
private String 

PROPERTY_NAME_HIBERNATE_FORMAT_SQL=
"spring.jpa.properties.hibernate.format_sql";

@Bean(destroyMethod = "close")
DataSource dataSource(Environment env) {
    HikariConfig dataSourceConfig = new HikariConfig();

dataSourceConfig.setDriverClassName(env.getRequiredProperty
(PROPERTY_NAME_DB_DRIVER_CLASS));
    dataSourceConfig.setJdbcUrl(env.getRequiredPropert
(PROPERTY_NAME_DB_URL));
    dataSourceConfig.setUsername(env.getRequiredProperty
(PROPERTY_NAME_DB_USER));
    dataSourceConfig.setPassword(env.getRequiredProperty
(PROPERTY_NAME_DB_PASSWORD));

    return new HikariDataSource(dataSourceConfig);
}

@Bean
LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource 
dataSource, Environment env) {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new 
LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setDataSource(dataSource);
    entityManagerFactoryBean.setJpaVendorAdapter(new 
HibernateJpaVendorAdapter());
    entityManagerFactoryBean.setPackagesToScan(ENTITY_PACKAGES);

    Properties jpaProperties = new Properties();

    //Configures the used database dialect. This allows Hibernate to create SQL
    //that is optimized for the used database.
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));

    //Specifies the action that is invoked to the database when the Hibernate
    //SessionFactory is created or closed.
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));

    //Configures the naming strategy that is used when Hibernate creates
    //new database objects and schema elements
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));

    //If the value of this property is true, Hibernate writes all SQL
    //statements to the console.
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));

    //If the value of this property is true, Hibernate will use prettyprint
    //when it writes SQL to the console.
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));

    entityManagerFactoryBean.setJpaProperties(jpaProperties);

    return entityManagerFactoryBean;
}

@Bean
JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);
    return transactionManager;
}

Application.properties:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
app.datasource.url=jdbc:mysql://localhost:3306/zavrsni?useSSL=false
app.datasource.username=....
app.datasource.password=....

#Hibernate Configuration
spring.jpa.properties.hibernate.dialect = 
org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.hibernate.naming-strategy = 
org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

还有报错:

Description:

Parameter 0 of constructor in com.javar.serviceImpl.ProjectServiceImpl 
required a bean of type 'com.javar.repositoryy.ProjectRepository' that 
could not be found.

Action:

Consider defining a bean of type 'com.javar.repositoryy.ProjectRepository' 
in your configuration.

}

【问题讨论】:

    标签: spring-boot service repository javabeans


    【解决方案1】:

    你可以试试这个:

    @Autowired
    private ProjectRepository projectRepository;
    

    并使用该注释删除此构造函数:

    @Autowired
    public ProjectServiceImpl(ProjectRepository projectRepository) {
        this.projectRepository = projectRepository;
    }
    

    如果这对您有帮助或您有一些问题,请稍后让我编辑此答案。

    更新

    确保找到存储库的位置正确的包。

     @EnableJpaRepositories(basePackages = {"com.javar.domain"})
    

    所以将包更新为“com.javar.repositories”

    【讨论】:

    • 试过了,不幸的是没有任何改变。无论如何感谢您的帮助。 :)
    • @aratata 你收到了哪些错误消息?
    • *************************** 应用程序无法启动 *********** ****************** 描述:com.javar.serviceImpl.ProjectServiceImpl 中的字段 projectRepository 需要找不到类型为“com.javar.repositoryy.ProjectRepository”的 bean。行动:考虑在你的配置中定义一个“com.javar.repositoryy.ProjectRepository”类型的bean。还是一样的
    【解决方案2】:

    终于找到了答案,所以我只需要在我的 Application 类上方添加 @EnableJpaRepositories(basePackages = "com.javar.repositoryy") 。希望这对将来的某人有所帮助。

    【讨论】:

      【解决方案3】:

      通过添加(在我的情况下缺少)maven 依赖项解决了这个错误:

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

      【讨论】:

        猜你喜欢
        • 2020-11-21
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 2021-06-09
        • 2017-03-25
        • 2015-09-24
        • 2018-05-30
        相关资源
        最近更新 更多