使用BeanIO将空白字符串取消编组为null



BeanIO参考指南指出,对于固定长度的流:

如果required设置为false,则不管填充字符是什么,都会将空格解组为null字段值。

因此,如果我正确理解这句话,这意味着下面的测试应该通过这个pojo:

@Record
public class Pojo {
    @Field(length = 5, required = false)
    String field;
    // constructor, getters, setters
}

测试:

@Test
public void test(){
    StreamFactory factory = StreamFactory.newInstance();
    factory.define(new StreamBuilder("pojo")
    .format("fixedlength")
    .addRecord(Pojo.class));
    Unmarshaller unmarshaller = factory.createUnmarshaller("pojo");
    Pojo pojo = (Pojo) unmarshaller.unmarshal("     "); // 5 spaces
    assertNull(pojo.field);
}

但它失败了,5个空格被解组为一个空字符串。我错过了什么?如何将空间解组为空字符串?

最后,我使用了一个基于StringTypeHandler:的类型处理程序来解决这个问题

@Test
public void test(){
    StringTypeHandler nullableStringTypeHandler = new StringTypeHandler();
    nullableStringTypeHandler.setNullIfEmpty(true);
    nullableStringTypeHandler.setTrim(true);
    StreamFactory factory = StreamFactory.newInstance();
    factory.define(new StreamBuilder("pojo")
        .format("fixedlength")
        .addRecord(Pojo.class)
        .addTypeHandler(String.class, nullableStringTypeHandler)
    );

    Unmarshaller unmarshaller = factory.createUnmarshaller("pojo");
    Pojo pojo = (Pojo) unmarshaller.unmarshal("     ");
    assertNull(pojo.field);
}

更新:正如beanio用户组上的一位用户所建议的那样,也可以在@Field注释中使用trim=true, lazy=true

    @Field(length = 5, trim = true, lazy = true) 
    String field;

相关内容

  • 没有找到相关文章

最新更新