Spring 集成 xml 反应堆 StringUtils 上的文件错误

Spring integration xml file errors out on reactor StringUtils

我有一个 spring 集成 sftp 流,我将其作为整个应用程序上下文中的子上下文加载。这是基于dynamic ftp SI example。我的集成流程中没有任何关于反应器或流的内容。它是一个简单的流程,一个 direct channel 与一个 sftp-outbound-gateway 连接,然后 运行 将文件传输到 sftp 服务器。我什至可以 运行 单元测试并且流程工作正常(能够 t运行sfer 文件)但是当我 运行 加载完整父应用程序然后初始化子应用程序的集成测试时在其中加载了此 sftp 流的上下文中,它会抛出无法找到 reactor/StringUtils class 的错误。

原因似乎是 spring-integration-sftp 将反应器罐加载为 t运行sient deps 但由于我的父应用程序已经在 classpath 我从 spring 集成部门中排除了反应堆核心。如果我不从 spring-integration 中排除 reactor-core,那么就会有一些版本冲突,所以我想排除它。

reactorVersion = 2.0.0.M2

compile("io.projectreactor:reactor-core:$reactorVersion")
compile "io.projectreactor.spring:reactor-spring-context:$reactorVersion"

compile("org.springframework.integration:spring-integration-sftp") {
    exclude module: "reactor-core"
}

正在初始化 SI 流程

context = new ClassPathXmlApplicationContext(new String[] { "classpath:adapters/"
                + sink.getConfigurationFile() }, false);
        setEnvironment(context, sink);
        context.setParent(parentContext);
        context.refresh();
        context.registerShutdownHook();

集成测试时的错误运行

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [adapters/sftp.xml]; nested exception is java.lang.NoClassDefFoundError: reactor/util/StringUtils at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)

终于SI流

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-sftp="http://www.springframework.org/schema/integration/sftp"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/sftp http://www.springframework.org/schema/integration/sftp/spring-integration-sftp.xsd">

<import resource="common.xml" />

<bean id="sftpSessionFactory"
    class="org.springframework.integration.file.remote.session.CachingSessionFactory">
    <constructor-arg ref="defaultSftpSessionFactory" />
</bean>

<bean id="defaultSftpSessionFactory"
    class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
    <property name="host" value="${sink.host}" />
    <property name="port" value="22" />
    <property name="privateKey" value="${sink.private.key}" />
    <property name="privateKeyPassphrase" value="${sink.private.key.phrase}" />
    <property name="user" value="${sink.user}" />
    <property name="password" value="${sink.pass}" />
</bean>

<int:channel id="input" />

<int-sftp:outbound-channel-adapter
    auto-startup="true" session-factory="sftpSessionFactory" channel="input"
    remote-directory="${sink.path}" remote-filename-generator-expression="headers['remote_file_name']">
    <int-sftp:request-handler-advice-chain>
        <bean
            class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
            <property name="onSuccessExpression" value="payload" />
            <property name="successChannel" ref="successChannel" />
            <property name="onFailureExpression" value="payload" />
            <property name="failureChannel" ref="failureChannel" />
            <property name="trapException" value="true" />
        </bean>
    </int-sftp:request-handler-advice-chain>
</int-sftp:outbound-channel-adapter>

<int:channel id="successChannel" />
<int:service-activator input-channel="successChannel"
    ref="completionHandler" method="handle" />

<int:channel id="failureChannel" />
<int:service-activator input-channel="failureChannel"
    ref="failureHandler" method="handle" />


正在更新以添加我的反应器配置

@Configuration
@EnableReactor
public class ReactorConfiguration {

static {
    Environment.initializeIfEmpty().assignErrorJournal();
}

@Bean
public EventBus eventBus() {
    return EventBus.config().env(Environment.get()).dispatcher(Environment.SHARED).get();
}

@Bean
public IdGenerator randomUUIDGenerator() {
    return new IdGenerator() {
        @Override
        public UUID generateId() {
            return UUIDUtils.random();
        }
    };
}
}

Gradle目前在排除传递依赖的依赖方面做得不好。

不是 spring-integration-sftp 拉入反应堆,是 spring-integration-core

尝试通过它明确排除。

我们已经删除了 SI 4.2 中的硬传递反应器依赖项(但尚未发布)。

spring 团队创建了一个 gradle plugin 可能会有所帮助。