我仍在努力使用Spring Integration 5.5实现以下流程:
- 从远程SFTP服务读取文件作为InputStream
- 将该流转换为自定义实体
- 通过JPA持久化实体
- 从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编译器,所以很高兴看到一些其他的解释和提示我们的代码有什么问题。