提问人:Vainlyh 提问时间:1/24/2014 最后编辑:naXa stands with UkraineVainlyh 更新时间:11/15/2023 访问量:184243
IntelliJ IDEA 在使用 Spring 的 @Autowired 注解时显示错误
IntelliJ IDEA shows errors when using Spring's @Autowired annotation
问:
当我在类中使用 Spring 的注释时,IntelliJ IDEA 显示错误,但该类运行没有任何问题。@Autowired
这是以下错误消息:
Autowired 成员必须在有效的 spring 中定义 豆类(@Component/@Service等)少...(Ctrl+F1 组合键)检查自动接线 Bean 类中的问题。
答:
确保你的 Spring bean 定义正确无误。有时,应用程序运行良好,它只是在 IDE 中显示错误,如果您定义了 Spring facet,请检查您的项目“iml”文件。
评论
我遇到了同样的问题。我的是因为包含自动连线引用的 bean 不是 Spring 组件(它是一个 EJB),而是得到了一个允许使用自动布线的 SpringBeanAutowiringInterceptor 拦截器。我认为 Intellij 在其自动接线检查中没有考虑这种可能性。
我也有这个问题。 执行 +,然后要求在受影响的线路上重新运行或禁用 Spring 检查,修复了它。 这似乎只是在 13.4 更新后才成为一个问题。altenter
这里有同样的错误!
似乎 Intellij 无法验证类实现是@Service还是@Component。
只需从“错误”更改为“警告”(按Alt + Enter)即可解决它。
评论
我在使用 IntelliJ IDEA 13.1.4 时遇到了同样的问题 我通过删除 Spring facet(File->Project Structure)并让它只显示“检测”来解决它。
评论
我有同样的问题。我通过为每个相关模块添加 Spring facet(File->Project Structure)来解决它,然后添加配置文件。对于某些项目(spring mvc),会自动检测到配置文件。但是,对于 jar 项目,我必须手动添加配置文件。
从所有项目模块中删除 .iml 文件,然后转到 File -> Invalidate Caches/Restart
评论
.iml
pom.xml
ctrl + s
.iml
这似乎是可见性问题 - 父控制器看不到您尝试连接的组件。
尝试添加
@ComponentScan("path to respective Component")
到父控制器。
就我而言,我缺少在web.xml中编写:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
在应用程序上下文文件中:
<context:component-scan base-package=[your package name] />
添加此标签并运行 Maven 以重建项目后,Intellj 中的 Autowired 错误会消失,并且 Bean 图标会出现在左边距中:
如果您知道 bean 存在并且它只是检查的问题,那么只需在变量声明之前添加以下内容:
@SuppressWarnings("SpringJavaAutowiringInspection")
@Inject MyClass myVariable;
有时,如果已声明 Bean,IntelliJ 无法解析,例如,当 Bean 被有条件地包含并且条件解析在运行时动态发生时。在这种情况下,IntelliJ 的静态代码分析器似乎无法检测到 bean。
我的是没有在我的 CrudRepository 界面上添加@Repository,我正在观看的教程没有在 STS 上添加它,它也没有抱怨。
确保您的 IntelliJ Idea (IDE) 了解正在检查模块的所有必要 spring 配置。
您可以在
Spring > [右侧面板中的项目名称] > [右侧面板中的项目名称] > 项目结构>模块文件
有时,我们需要明确地告诉 IDE spring配置来自依赖项(项目类路径中存在的jar)
评论
文件 -> ProjectStructure -> 模块 -> +(在中央列中) -> Spring ->确定
评论
您应该检查课程中是否添加了@Component、@Repository或类似内容
eg1:
director:Settings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class
operate:checkout 勾去掉
eg2:
1.impl class add @service
like this:
@Service
public class CityServiceImpl implements CityService{
@Autowired
private CityDao cityDao;
like this
2.dao file class add @Repository
@Repository
public interface CityDao {
我已经以这种方式解决了这个问题。 在 IntelliJ 中,所有包都应该位于一个子包中,该子包是 main/java 的子包。 例如,我把我所有的包都放在 src/main/java/com.misisol.watchStore/ 下,然后 spring 可以找到我的 bean。
Inject Bean with @Qualifier为我解决了这个问题。
我有类似的问题。我通过取消选中“处理显式注释的豆子”选项解决了它(见下面的屏幕截图)。默认情况下,此选项在 Linux 上处于启用状态。 现在可以看到@Service和@Configurations注释。截屏
通过转到“文件”>>“项目结构>> Facets”,然后将所有配置文件添加到Spring Facet来解决此问题。 之后,它开始检测 Bean 所在的文件,并能够对问题进行排序。 IntelliJ 提供此检查非常有价值,恕我直言,不应禁用。
评论
我通过添加 supress 警告来修复它:
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
private ....
评论
@SupressWarnings
有点晚了,但我希望它对其他人有所帮助。
请确保将@Service放在服务的实现类上
@Service
public class ServiceNameImpl implements ServiceName {
@Override
public void method(ObjectType paramName) {
//CODE
}
}
这就是我修复错误的方式。
我知道这是一个老问题,但我还没有遇到任何为我解决这个问题的答案,所以我将提供我的解决方案。
注意:我认为问题可能是这个,但我的问题与两次实现相同的接口无关。使用确实让我的问题消失了,但这是一个绷带,不是一个适当的解决方案,所以我没有解决这个问题。@Qualitier
背景
我的任务是维护一个旧项目,该项目经历了不同版本的 spring,并且只针对单独的模块进行了更新,因此至少可以说,事情需要重构。我最初遇到了重复的 bean 问题,并且即使只有一个 bean,也通过修补在 OP 的问题和重复的 bean 问题之间来回更改问题;导航到重复的 Bean 总是转到同一个类。
问题
该问题存在于一个类中,该类也具有注释。我注意到我还有一个 spring 在基础包上做一个,我相信这是旧版本 Spring 的原始方法。我正在创建一个新分支,在一个支持项目中采用旧分支和新分支的一部分,该项目用于几年来开发的不同项目,这就是为什么有如此混合和匹配的方法。@Repository
@Autowired
@Service
@ComponentScan
application-config.xml
context:component-scan
简单的解决方案
由于已经实施了更现代的使用方法,我刚刚删除了它,问题就解决了。@ComponentScan
application-config.xml
以下内容对我有用:
- 查找所有实现 service(interface) 的类,该类会给出错误。
- 用 @Service 注释标记每个类,以将它们指示为业务逻辑类。
- 重新生成项目。
我可能有点晚了,但在花了几个小时研究这个问题之后。
我发现在最新版本的 IntelliJ 2020 中,@AutoWired是可选的,基于构造函数的 depedency 注入是可取的。
我通过简单地从 Service 和 Controller 类中删除 @AutoWired Annotation 并使用基于构造函数的依赖注入来解决这个问题。
此链接可能会有所帮助。
祝您编码愉快!
评论
我在 2019.2.4 版本的 IntelliJ 中只有一个服务具有基于构造函数的依赖注入时遇到了这个问题。 我发现更改服务名称(shift + f6)然后放弃 git 级别的更改很有帮助。
我有同样的问题。
我认为修复它的正确方法是告诉 Intellij 找到正确的 Spring 上下文,而不是“抑制警告”。
简而言之,File -> ProjectStructure(⌘;) -> Modules -> (选择模块) -> Spring -> (点击'+'添加上下文) -> OK
添加上下文文件:
做!
对于那些正在使用 IDEA 的用户,您可以简单地删除您知道的那些警告。
在 mac 中,将你的诅咒移动到红色波浪线,按 option+enter(使用 Windows 时为 alt+enter),你会看到建议:
尝试它们,你会看到自动添加SuppressWarnings
记住,总是给出很好的解决方案。option+enter
我在 IntelliJ 上通过向我的类添加注释解决了这个问题,例如
@Repository
@Service
抑制警告气味可能不起作用,因为警告可能指示实例未注入,即它为 null。
如果您使用的是 Spring Boot:
- 对我有用的是用 @SpringBootTest(ClassName.class) 注释我的测试类,其中 ClassName ><替换为被测试类的名称。
- 注释的工作原理是创建将在测试中使用的 ApplicationContext,从而识别@autowired注释
通过在类上方添加 @SpringBootTest 来解决此问题
评论
将这两个注解放在单元测试类的顶部:
@SpringBootTest
@ExtendWith(SpringExtension.class)
class VerificationServiceTest {
@Autowired
private VerificationService service;
@Test
void matchUserBiometric() {
service. // some method / property
}
}
出现此错误是因为 Spring 容器上没有服务类的实例,因此基本上当您尝试运行测试时会出现空点,您需要初始化 Spring,然后您的类的实例将可用。
显示的错误是指当您尝试将有效类转换为本身不是有效 Spring 的类时的情况。@Autowire
@Bean
@Bean
首先,通过使用相关的 Spring Stereotype: 或它的专用化(如 、 或 )来注释它,确保您尝试将 Bean 自动连接到其中的类是有效的 Spring Bean。根据 Spring Framework 文档(参见此处),用 或它的任何专用化注释的类是:@Component
@Controller
@Repository
@Service
@Component
[...]在使用基于注释的配置和类路径扫描时被视为自动检测的候选项。
在某些情况下,可能会发生 IntelliJ Spring 插件无法解析依赖关系树的情况。如果您确定是 IDE 搞砸了,您可以尝试:
- 删除本地存储库中的文件夹,然后转到并重新加载项目
.idea
File -> Invalidate Caches
评论
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
alt + enter
rigth arrow
Suppress for class
@SuppressWarnings