Spring Boot找不到豆

时间:2018-11-05 14:58:21

标签: spring-boot

我有一个Spring Boot项目,该项目具有一些我需要在主应用程序中作为Bean导入的外部软件包。

因此,我的主要应用程序位于com.package.app程序包中,而某些类(包括一些存储库)位于com.package.commons程序包中。

为了使用这些bean,我将主类注释如下:

@SpringBootApplication
@ComponentScan({ "com.package.commons" ,"com.package.app"})
@EnableScheduling
@EnableAsync
public class EmanagerApplication extends SpringBootServletInitializer{


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

}

但是,当我启动应用程序时,可能会发生(并非总是但非常频繁)启动失败并出现以下错误:

Description:

Field repository in com.package.commons.service.BrandService required a bean of type 'com.package.commons.persistence.repository.BrandRepository' that could not be found.


Action:

Consider defining a bean of type 'com.package.commons.persistence.repository.BrandRepository' in your configuration.

我的BrandRepository带有@Repository注释,服务类带有@Service

真正奇怪的是,如果我在结束时继续启动该应用程序,它会闪烁...但是没有理由...

2 个答案:

答案 0 :(得分:0)

如果您使用的是JPA,则还需要@EnableJpaRepositories批注。

还考虑使用@EnableTransactionManagement启用声明式事务处理。

例如在拥有JPA实体和JPA存储库(未试用)的同一包或父包中使用以下内容:

import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.jta.JtaTransactionManager;

@Configuration
@EntityScan
@EnableJpaRepositories
@EnableTransactionManagement
public class HibernateConfig extends JpaBaseConfiguration {

    public HibernateConfig(DataSource dataSource, JpaProperties properties, ObjectProvider<JtaTransactionManager> jtaTransactionManager,
            ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
        super(dataSource, properties, jtaTransactionManager, transactionManagerCustomizers);
    }

    @Override
    protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
        return new HibernateJpaVendorAdapter();
    }
    @Override
    protected Map<String, Object> getVendorProperties() {
        return new HashMap<>();

    }
}

也不要忘记使用@Transactional注释您的@Service类。

答案 1 :(得分:0)

如果使用此应用程序的启动方法确认Application很好,并确认@ComponentScan也很好。而且JPA的配置文件yamlproperties也很好。

如何尝试像这样扩展JPA存储库:

public class xxxResponsitory extends JpaRepository<T, E>{
    ...
}

因为JpaRepository已经用@Repository注释了,T的意思是Primary Key的类型,我总是使用IntegerLong,自动装箱类型。 E表示此存储库的主要类型。
举个例子:
现在我们有了一个名为User的实体类型,User的主键类型是Long,我将这样编写存储库:

public class UserRepository extends JpaRepository<Long, User>{
   ...
}

不需要注释任何东西,那么在服务类@Autowried UserRepository中,一切都可以很好地运行。但是请确保我在回答开始时说的话。

希望这可以为您提供帮助。