BeanIO定长文件写入:不改case类、不设字段长为0如何跳过指定字段
BeanIO 隐藏Case类字段写入输出的实现方案
- 核心实现逻辑:完整保留Scala侧的case类定义,完整保留XML配置中dob字段的原有配置条目,仅通过BeanIO提供的原生配置参数修改字段的写入行为,完全满足约束要求。
- 方案1:使用BeanIO原生字段忽略属性
直接在原有dob字段的XML配置行上新增ignore="true"参数即可:
该配置的实际效果:<record name="emp" class="employee"> <field name="id" position="0" length="5" getter="#1" setter="id"/> <field name="name" position="5" length="5" getter="#2" setter="name"/> <!-- 保留原有所有position、length、getter、setter配置,仅新增ignore属性 --> <field name="dob" position="10" length="5" getter="#3" setter="dob" ignore="true"/> </record>- BeanIO初始化映射时会校验到dob字段的配置条目,不会触发“case类成员未映射”的报错
- 实际序列化写入时会完全跳过dob字段的内容输出,不会在文件中生成任何和dob相关的内容
- 所有原有配置的length、position参数完全保留,不存在将length设为0的问题
- 方案2:通过自定义空类型转换器实现
如果使用的BeanIO版本不支持ignore属性,可以给dob字段绑定一个固定返回空内容的类型转换器:
对应的<record name="emp" class="employee"> <field name="id" position="0" length="5" getter="#1" setter="id"/> <field name="name" position="5" length="5" getter="#2" setter="name"/> <field name="dob" position="10" length="5" getter="#3" setter="dob" typeHandler="emptyOutputHandler"/> </record>emptyOutputHandler只需要实现BeanIO的TypeHandler接口,在类型转换方法中直接返回空字符串,即可实现写入时不输出dob字段内容的效果,同样不需要修改case类定义、不需要调整dob字段的length配置。 - 注意事项:
- 不要直接删除dob字段的XML配置行:因为BeanIO绑定Scala case类时会自动扫描所有构造参数,要求每个参数都有对应的映射条目,删除后会直接触发“类成员未映射”的初始化异常,这也是之前直接移除配置会报错的根本原因
- 所有调整仅需在BeanIO的XML映射配置中完成,不需要修改Scala侧的case类代码
- 不要随意修改id、name字段的原有position、length参数,避免触发定长记录的偏移量校验错误
- 因为dob字段被标记为忽略/空输出,BeanIO不会为该字段分配实际的文件写入位置,不会抛出字段长度不匹配的异常
内容的提问来源于stack exchange,提问作者Jerin Thomas
相关产品推荐
相关产品推荐

