Spring集成:在处理程序拒绝事务上下文之前调用transformer



我仍在努力使用Spring Integration 5.5实现以下流程:

  1. 从远程SFTP服务读取文件作为InputStream
  2. 将该流转换为自定义实体
  3. 通过JPA持久化实体
  4. 从SFTP服务器删除远程文件

所以,我使用Java DSL有以下流程:

@Configuration
public class Flow {
@Bean
public StandardIntegrationFlow createFlow() {
return IntegrationFlows
.from(source())
.publishSubscribeChannel(pubSub -> pubSub
.subscribe(sub1 -> sub1
.transform(Message.class, this::transform)
.handle(persist(), e -> e.transactional(false))
)
.subscribe(sub2 -> sub2 
.handle(remove())
)
)
.get();
}
public MessageSource<InputStream> source() {
return null;
}
public Message<MyEntity> transform(Message<InputStream> message) {
return null;
}
public JpaOutboundGateway persist() {
return null;
}
public AbstractMessageHandler remove() {
return null;
}
}

我的IDE (VSCode)没有给我任何关于此代码的警告,但是当尝试使用Apache Maven 3.8/JDK 17编译它时,我得到以下编译错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project amqp: Compilation failure
[ERROR] /C:/Users/.../src/main/java/com/example/Flow.java:[25,46] cannot find symbol
[ERROR]   symbol:   method transactional(boolean)
[ERROR]   location: variable e of type java.lang.Object

原因似乎是转换(transform()),因为只要我删除该转换,代码就会编译。当然,它会在运行时失败,因为persist()方法需要一个Message,而不是Message.

我的转换方法签名有什么问题吗?

确认。看起来像是Java编译器本身的一些错误。当我交换transform()handle()时,它就编译了。或者如果我删除它或以其他方式修改…

你现在可以使用这个作为一个解决方案:

.transform(this, "transform")

编译器错误与您的transform()定义完全无关。

我可能会错误地判断Java编译器,所以很高兴看到一些其他的解释和提示我们的代码有什么问题。

最新更新