我有一个Spring MVC和Spring Boot的项目,我使用IntelliJ。 我的项目是这样的:
main -> java -> mypackage -> authentification -> WebSecurityConfig.java
-> configuration -> ApplicationConfiguration.java
-> controller -> WelcomeMessageController.java
-> service -> WelcomeMessageService.java
-> Impl -> WelcomeMessageServiceImpl.java
test -> java -> mypackage -> WelcomeMessageTest.java
我使用@Service
注释服务实现。
我用
注释配置文件@Configuration
@ComponentScan(basePackages = "mypackage")
在控制器中,我用
注入服务@Autowired
WelcomeMessageService welcomeMessageService;
在测试类中,我使用相同的注释注入相同的服务:
@Autowired
WelcomeMessageService welcomeMessageService;
我用以下内容注释测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ApplicationConfiguration.class, loader = SpringApplicationContextLoader.class)
@WebAppConfiguration
在控制器中,注射工作正常,但在测试类中,IntelliJ说:
无法自动装配。找不到WelcomeService类型的bean。
当我运行测试时,它可以工作,但我不明白为什么IntelliJ说它找不到bean。
我发现这个主题说它在IntelliJ上发生了一段时间,但我不想使用@SuppressWarnings
注释。
有没有人有其他解决方案来解决这个问题?
答案 0 :(得分:0)
我遇到了无法将AutowWire bean引入Integration测试类的问题。你的问题通过添加" ContextConfiguration"帮助我解决这个问题。 annocation而不是" SpringApplicationConfiguration"我正在使用它。
然而,我现在唯一的区别是你缺少Application类中的@EnableAutoConfiguration(扩展SpringBootServletInitializer)或者你的@Configuration类。
希望这可以解决您的问题。底线是在这种非常具体的情况下导致不适当的注释。
答案 1 :(得分:0)
对我来说,这是一个组件扫描问题,我的模型位于单独的模块,然后是我的Spring Boot App。通常情况下, @SpringBootApplication 有一个 @ComponentScan ,未指定时会按如下方式扫描:
{@link #basePackageClasses}或{@link #basePackages}(或 可以指定其别名* {@link #value})来定义特定的 包扫描。如果未定义特定*包,则扫描 将从声明这个的*类的包中发生 注释
如果您的SpringBootApp Main类位于不同的包上,那么您需要指定ComponentScan。如果您使用多个模块,请在Configuration类中指定它。
Config class Annotations:
@Configuration
@ComponentScan(basePackages = "app.data")
Testclass Annotations:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { PropertyPlaceholderAutoConfiguration.class, DynamoConfig.class })