如何将参数从执行上下文传递到MultiResourcePartitioner并实现Resource数组注入
Spring Batch MultiResourcePartitioner 注入Resource数组正确方案
你参考的《The Definitive Guide to Spring Batch》第11章对应描述翻译如下:
我们需要在这个分区器上配置的另一个参数是Resource数组,配置完成后就可以返回实例对象
错误原因
你传入的inputFiles作业参数使用分号;作为多个资源的分隔符,但Spring默认将字符串自动转为Resource[]时,使用的默认分隔符是英文逗号,,所以无法正确拆分解析为资源数组。
正确实现方式
两种可选方案:
方案1:修改参数分隔符为逗号(最简适配)
直接调整作业参数中多个文件的分隔符为英文逗号,原分区器Bean代码无需修改:
Map<String, JobParameter> parameters = new HashMap<>(); JobParameter parameter = new JobParameter(new Date()); parameters.put("currentTime", parameter); // 将分号替换为英文逗号 parameters.put("inputFiles", new JobParameter("1.csv,2.csv"));
如果你的文件存放在类路径下,建议加上classpath:前缀(示例:classpath:1.csv,classpath:2.csv);如果是文件系统绝对路径,加上file:前缀,避免Spring无法定位资源。
方案2:保留分号分隔符,调整@Value解析逻辑
如果业务要求必须使用分号作为分隔符,可以修改@Value的SpEL表达式,手动按分号拆分字符串:
@Bean @StepScope public MultiResourcePartitioner multiResourcePartitioner(@Value("#{jobParameters['inputFiles'].split(';')}") Resource[] resources){ MultiResourcePartitioner partitioner = new MultiResourcePartitioner(); partitioner.setKeyName("file"); partitioner.setResources(resources); return partitioner; }
Spring会自动将拆分后的每个路径字符串转换为对应的Resource实例,无需额外转换逻辑。
内容的提问来源于stack exchange,提问作者carlos palma
相关产品推荐
相关产品推荐

