You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:45:32