我有一个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
真正奇怪的是,如果我在结束时继续启动该应用程序,它会闪烁...但是没有理由...
答案 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的配置文件yaml
或properties
也很好。
如何尝试像这样扩展JPA存储库:
public class xxxResponsitory extends JpaRepository<T, E>{
...
}
因为JpaRepository
已经用@Repository
注释了,T
的意思是Primary Key
的类型,我总是使用Integer
或Long
,自动装箱类型。 E
表示此存储库的主要类型。
举个例子:
现在我们有了一个名为User
的实体类型,User
的主键类型是Long
,我将这样编写存储库:
public class UserRepository extends JpaRepository<Long, User>{
...
}
不需要注释任何东西,那么在服务类@Autowried
UserRepository
中,一切都可以很好地运行。但是请确保我在回答开始时说的话。
希望这可以为您提供帮助。