Spring Batch升级4.0.3时setDelimiter方法参数类型不匹配报错
Spring Batch 2.1.8升级4.0.3版本DelimitedLineTokenizer编译报错适配方案
问题原因
Spring Batch Core在版本迭代中调整了DelimitedLineTokenizer的API定义:
setDelimiter方法的入参类型从旧版的char修改为String,用于支持多字符分隔符场景- 类内置的分隔符常量(如
DELIMITER_COMMA)同步从char类型改为String类型
原有代码基于旧版char类型的API编写,升级后会触发两个编译错误:
The method setDelimiter(String) in the type DelimitedLineTokenizer is not applicable for the arguments (char)
Type mismatch: cannot convert from String to char
适配修改方案
只需要调整自定义类中分隔符相关的类型定义,和新版API签名对齐即可,原有业务逻辑不需要改动。单字符分隔符场景下传长度为1的String和旧版本行为完全一致,不会出现功能差异。
修改后的可正常编译运行的代码如下:
import org.springframework.batch.item.file.LineCallbackHandler; import org.springframework.batch.item.file.transform.FieldSet; import java.util.List; public class HeaderCallbackTokenizer extends InterningDelimitedLineTokenizer implements LineCallbackHandler { // 分隔符字段类型从char改为String,匹配父类常量类型 private String delimiter = DELIMITER_COMMA; @Override // 重写方法入参类型从char改为String,匹配父类方法签名 public void setDelimiter(String delimiter) { super.setDelimiter(delimiter); this.delimiter = delimiter; } @Override public void handleLine(String line) { if (line.startsWith("X" + delimiter)) { List<String> names = doTokenize(line); names.set(0, "TYPE"); setNames(names.toArray(new String[0])); } } @Override public FieldSet tokenize(String line) { return super.tokenize(line); } }
额外注意
如果项目中其他位置有调用该自定义Tokenizer的setDelimiter方法传char类型参数的,需要将入参改为对应String值,例如原传入','改为传入","即可。
内容的提问来源于stack exchange,提问作者Jeff Cook
相关产品推荐
相关产品推荐

