如果我使用@EnableAutoConfiguration,IntelliJ 无法自动装配@ServiceActivator 方法中的参数

IntelliJ cannot autowire the parameter in @ServiceActivator method if I use @EnableAutoConfiguration

启用自动配置后,我的 Spring 集成服务激活器在 IntelliJ 中给我一个错误:“无法自动装配。找不到 'String' 类型的 beans。”

如果我禁用自动配置,错误就会消失。

我可以从自动配置中排除 class 来“修复”这个问题吗?我怎么知道是哪个?

这是@ServiceActivator:

@Slf4j
@MessageEndpoint
public class StringProcessor {
  @ServiceActivator(inputChannel = "channel1")
  public void processString(String s) {
    log.info(s);
  }
}

IntelliJ error message

错误可以通过@EnableAutoConfiguration (@SpringBootApplication)注解切换:

//@SpringBootApplication
@ComponentScan
@Configuration
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

如何确定这是 IntelliJ 误报、Spring 集成问题,还是我的判断有误? ;o)

那是 IntelliJ IDE误报和错误假设。

@ServiceActivator 的签名和结构从未设计用于注入。 当 channel1 中出现消息时,将在运行时调用此类方法。因此,端点激活该服务方法并将消息有效负载传递到该方法的 s 参数中。必要时进行相应的转换。 IDE.

中的 atuwiring 假设存在错误

在文档中查看有关服务激活器的更多信息:https://docs.spring.io/spring-integration/reference/html/messaging-endpoints.html#service-activator

这是误报,有人将此作为 JetBrains 的问题提出

https://youtrack.jetbrains.com/issue/IDEA-264916

您是否介意点击标题旁边的竖起大拇指,以便 Jetbrains 知道其他人希望此问题得到解决。

同时,您可以使用以下方法在方法级别禁用自省

@Slf4j
@MessageEndpoint
public class StringProcessor {

  @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
  @ServiceActivator(inputChannel = "channel1")
  public void processString(String s) {
    log.info(s);
  }

}

此类警告始终是来自 IDEA 的 'best guess',并且随着配置变得越来越复杂,特别是如果您引用在外部 jar 中创建的 bean,它会更频繁地发生。

它们不会停止编译或初始执行,但如果警告确实正确,Spring 本身将终止执行。