当ftpjavadsl配置被引入springintegrationcore时,为什么过滤器行为发生了变化

当ftpjavadsl配置被引入springintegrationcore时,为什么过滤器行为发生了变化,java,spring,spring-integration,spring-integration-dsl,Java,Spring,Spring Integration,Spring Integration Dsl,在Spring Integration 4中,我使用Spring Integration java dsl项目编写了如下代码: FtpInboundChannelAdapterSpec ftpAdapterSpec = Ftp.inboundAdapter(ftpSessionFactory) .preserveTimestamp(true) .remoteDirectory(remoteFolder)

在Spring Integration 4中,我使用Spring Integration java dsl项目编写了如下代码:

      FtpInboundChannelAdapterSpec ftpAdapterSpec = Ftp.inboundAdapter(ftpSessionFactory)
                .preserveTimestamp(true)
                .remoteDirectory(remoteFolder)
                .filter(new FtpPersistentAcceptOnceFileListFilter(metaDataStore, "ftp-inbound-" + id + ":"))
                .regexFilter(".*")                
                .localDirectory(Paths.get(System.getProperty("java.io.tmpdir"), "ftp-inbound", localPath).toFile()).autoCreateLocalDirectory(true)
                .deleteRemoteFiles(false);
请注意它如何包括一个regex过滤器和一个ftpperListentAcceptionFilterListFilter。这很有效

regexFilter包装的(原始java dsl项目)代码为:

public S filter(FileListFilter<F> filter) {
    if (this.filter == null) {
        if (filter instanceof CompositeFileListFilter) {
            this.filter = (CompositeFileListFilter<F>) filter;
        }
        else {
            this.filter = new CompositeFileListFilter<F>();
            this.filter.addFilter(filter);
        }
        this.synchronizer.setFilter(this.filter);
    }
    else {
        this.filter.addFilter(filter);
    }
    return _this();
}
public S过滤器(FileListFilter过滤器){
if(this.filter==null){
if(CompositeFileListFilter的筛选器实例){
this.filter=(CompositeFileListFilter)过滤器;
}
否则{
this.filter=新的CompositeFileListFilter();
this.filter.addFilter(filter);
}
this.synchronizer.setFilter(this.filter);
}
否则{
this.filter.addFilter(filter);
}
返回_this();
}
因此,正如您所看到的,它从传入的过滤器中构建了一个复合过滤器(并在传入更多过滤器时堆叠)

但当java dsl被引入核心集成时,过滤方法:

public S过滤器(FileListFilter过滤器){
此.synchronizer.setFilter(过滤器);
返回_this();
}
这本身很好,但是像regexFilter这样的方法:

@覆盖
公共FtpInboundChannelAdapterSpec regexFilter(字符串regex){
返回过滤器(composeFilters(新的FTPregregaterFileListFilter(regex));
}
@抑制警告(“未选中”)
专用CompositeFileListFilter composeFilters(FileListFilter FileListFilter){
CompositeFileListFilter CompositeFileListFilter=新的CompositeFileListFilter();
addFilters(fileListFilter,
新的FTPPersistentAcceptonFileListFilter(新的SimpleMetadataStore(),“ftpMessageSource”);
返回compositeFileListFilter;
}
因此,现在我没有的代码实现了我想要的功能,因为接受我的持久元数据存储的FtpPersistentAcceptOnceFileListFilter现在被接受SimpleMetaDataStore的FtpPersistentAcceptOnceFileListFilter所取代

所以现在,尽管代码在运行时编译得很好,但它会收到重复的代码


所以问题是它为什么被改变,有没有一个好的理由来改变它?因为regexFilter方法没有明显的副作用,所以它变得相当不可用。

它改变了
过滤器(FileListFilter过滤器)
优先于所有其他过滤选项的方式,就像XML配置一样,以保持一致性。这种行为的原因仅仅是因为我们不知道您希望组成这些过滤器的顺序。因此,为了确保正确的顺序,您需要自己构建一个
CompositeFileListFilter
,包括一个必需的
ftpregePatternFileListFilter
,并将其注入该
fitler()
选项

regexFilter()
patternFilter()
仍然在这里,以便在您只有此过滤器而没有其他过滤器的情况下配置简单的通用用例

public S filter(FileListFilter<F> filter) {
    this.synchronizer.setFilter(filter);
    return _this();
}
    @Override
    public FtpInboundChannelAdapterSpec regexFilter(String regex) {
        return filter(composeFilters(new FtpRegexPatternFileListFilter(regex)));
    }

    @SuppressWarnings("unchecked")
    private CompositeFileListFilter<FTPFile> composeFilters(FileListFilter<FTPFile> fileListFilter) {
        CompositeFileListFilter<FTPFile> compositeFileListFilter = new CompositeFileListFilter<>();
        compositeFileListFilter.addFilters(fileListFilter,
                new FtpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "ftpMessageSource"));
        return compositeFileListFilter;
    }