有一个Spring依赖注入问题

时间:2020-09-04 01:27:03

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

我因此有一个实体类

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显然不是托管类型?

3 个答案:

答案 0 :(得分:1)

我认为您不是要扫描包含Entity的程序包

// 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")

答案 1 :(得分:0)

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

  1. org.mystuff.daoorg.mystuff.dostuff.daoResultRepository更改为Result @ComponentScan(basePackages = "org.mystuff.dostuff")
  2. 另一个正在将AppTestConfig中的@ComponentScan(basePackages = "org.mystuff")更改为@ComponentScan

org.mystuff.dostuff将使spring仅管理basePackage下的那些bean(由@ Component,@ Service和其他@Bean Annotation注释)。 您将basePackage设置为Result,因此@Bean ResulRepoContentDisposition不在Spring的管理范围内,因为它们不在提供的basePackage中。

答案 2 :(得分:0)

我不确定为什么,但是这个问题通过使UtilityClassA成为原型bean得以解决。我假设由于它是单例,因此可能以依赖容器不知道的方式使用它,因此实例化了它。

谢谢您的回答。他们带领我找到了解决方案。