我因此有一个实体类
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显然不是托管类型?
答案 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)
您有两种方法可以解决问题。选择适合您的条件。
org.mystuff.dao
和org.mystuff.dostuff.dao
都ResultRepository
更改为Result
@ComponentScan(basePackages = "org.mystuff.dostuff")
。@ComponentScan(basePackages = "org.mystuff")
更改为@ComponentScan
org.mystuff.dostuff
将使spring仅管理basePackage下的那些bean(由@ Component,@ Service和其他@Bean Annotation注释)。
您将basePackage设置为Result
,因此@Bean ResulRepo
和ContentDisposition
不在Spring的管理范围内,因为它们不在提供的basePackage中。
答案 2 :(得分:0)
我不确定为什么,但是这个问题通过使UtilityClassA成为原型bean得以解决。我假设由于它是单例,因此可能以依赖容器不知道的方式使用它,因此实例化了它。
谢谢您的回答。他们带领我找到了解决方案。