为什么要加载WebMvcConfigurer?

时间:2018-07-18 09:41:20

标签: java spring-boot spring-data

我是Spring的新手,正在使用Postgresql / JPA和MongoDB组件测试Spring Data项目。我的Test类具有以下注释:

@SpringBootApplication
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringMongoConfig.class, PgRepository.class, MongodbRepository.class})
public class PerfTest {

  @Autowired
  private PgRepository pgRepo;

  @Autowired
  private MongodbRepository mongoRep;

由于某种原因,spring-context模块在​​解析bean类时试图加载WebMvcConfigurer,给了我NoClassDefFoundError

Spring Boot Autoconfigure是否尝试启动完整的Web控制器套件?如果是这样,为什么?我真的只是对Spring Data感兴趣。我应该完全避免使用Spring Boot吗?

2 个答案:

答案 0 :(得分:1)

您不应将测试类注释为@SpringBootApplication。此注释用于在您的主代码库中定义一个类,该类包含main()方法,以通过自动配置启动您的Spring引导容器。

如果您对测试感兴趣的是Spring数据,那么您的测试将需要指向一个用@Configuration注释的@EnableJpaRepositories类,这将使您的存储库接口可以自动装配。

我不知道您的SpringMongoConfig类中有什么,但是如果其中包含该注释,那么您要做的就是:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {SpringMongoConfig.class})
public class PerfTest {

否则,您需要设置此配置并将其包含在测试的@ContextConfiguration中。

另一个更重的选项是,它可以保证所有内容均可用于您的测试(前提是您的Spring Boot应用程序已正确设置),即用@SpringBootTest标记您的测试,这将自动加载整个Spring Boot应用程序的上下文。如果找不到主类,可以通过在注释中提供该类来将其指向正确的方向:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyMainClass.class)
public class PerfTest {

答案 1 :(得分:0)

您需要将 @Component 添加到存储库界面。 Spring首先加载组件类,然后进行@AutoWiring和变量初始化。