【问题标题】:Having a Spring dependency injection problem遇到 Spring 依赖注入问题
【发布时间】:2020-09-04 01:27:03
【问题描述】:

因此我有一个实体类

package org.mystuff.dao.entity;

@Entity
public class Result {
   @Id
   private int id;
   private int someStuff;

   public Result(int someStuff) {
       this.someStuff = someStuff;
   }

   public int getSomeStuff() {
       return someStuff;
   }

   public void setSomeStuff(int SomeStuff) {
       this.someStuff = someStuff;
   }
}

我有一个仓库

package org.mystuff.dao.repo;

@Repository
@Transactional
public interface ResultRepository extends JpaRepository<Result, Long> {

    List<Result> getResultByDate(Date date);

}

我有几个组件类

package org.mystuff.dostuff;

@Component
public class UsefulClassA {

    @Autowired
    private ResultRepository resultRepository;

    @Autowired
    private SomethingUseful somethingUseful;

    private Date date;

    public void doStuff() {
        List<Result> resultList = resultRepository.getResultByDate(date);
        // Do something with resultList
    }
}

package org.mystuff.dostuff;

@Component
public class UsefulClassB {

    @Autowired
    private SomethingElseUseful somethingElseUseful;

    private int a;

    public void myMethod(int b)  {
       a = b;
    }

 }

我有一个测试配置类

package org.mystuff.test.config;

@RunWith(SpringRunner.class)
@ComponentScan(basePackages = "org.mystuff.dostuff")
@EnableJpaRepositories(basePackages = "org.mystuff.dao.repo", entityManagerFactoryRef = "mystuffEntityManagerFactory")
public class AppTestConfig {

    @Bean
    LocalContainerEntityManagerFactoryBean mystuffEntityManagerFactory() {
    
       final LocalContainerEntityManagerFactoryBean myEntityManagerFactoryBean = 
                  new.LocalContainerEntityManagerFactoryBean();
       myEntityManagerFactoryBean.setDataSource(myDataSource);
       myEntityManagerFactoryBean.setPackagesToScan("org.mystuff.dao.entity")
       return myEntityManagerFactoryBean;    
    }
}

最后,我的测试课

package org.mystuff.test;

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = AppTestConfig.class)
public MyBigTestClass {

    @Autowired
    private UsefulClassB usefulClassB;

    @Before
    public void beforeStuff() {
        // Do some before stuff
    }

    @Test
    public void doATest() {
        usefulClassB.doSomethingUseful();
    }

}

我得到一个由此引起的异常

Error creating bean with name 'resultRepository': Invocation of init method failed: nested exception is java.lang.IllegalArgumentException: Not a managed type: org.mystuff.dao.entity.Result

首先,为什么容器要实例化 resultRepository?它不在我正在测试的课程中。 其次,明明是托管类型,为什么却说 Result 不是托管类型?

【问题讨论】:

  • 请为您的课程添加导入,需要检查适当的导入
  • 您的ResultRepository 中的Result 可能有错误的import。检查一次或使用您的导入更新帖子

标签: spring hibernate jpa dependency-injection spring-data


【解决方案1】:

我认为你没有扫描包含实体的包

// your entity package is 
package org.mystuff.dao.entity;

// but you are scanning at `org.mystuff.dostuff`
@ComponentScan(basePackages = "org.mystuff.dostuff")

请尝试将其更改为

@ComponentScan(basePackages = "org.mystuff")

【讨论】:

    【解决方案2】:

    您有两种解决问题的方法。选择适合您的条件。

    1. org.mystuff.dao 更改为 org.mystuff.dostuff.dao 用于 ResultRepositoryResult
    2. 另一个是将 AppTestConfig 中的 @ComponentScan(basePackages = "org.mystuff.dostuff") 更改为 @ComponentScan(basePackages = "org.mystuff")

    @ComponentScan 将导致 spring 仅管理 basePackage 下的那些 bean(由 @Component、@Service 和其他 @Bean Annotation 注释)。 您将 basePackage 作为 org.mystuff.dostuff 提供,因此 @Bean ResultResulRepo 不受 Spring 管理,因为它们不在提供的 basePackage 中。

    【讨论】:

    • 我不能做第一,因为它会影响很多其他代码。我将补充一个问题,这是以前有效的。 2 号没有改变任何东西。
    • 您可以尝试在 MyBigTestClass 中使用 @SpringBootTest 并将其包重命名为 org.mystuff
    【解决方案3】:

    我不知道为什么,但是通过将 UsefulClassA 设置为原型 bean 解决了这个问题。我假设由于它是一个单例,它可能以依赖容器不知道的方式使用,所以它实例化了它。

    感谢您的回答。他们引导我找到解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 2011-07-26
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 2014-12-27
      • 2015-04-22
      • 2016-05-18
      相关资源
      最近更新 更多