Unmarshal пустые строки, чтобы обнулить с BeanIO

Справочное руководство BeanIO утверждает, что для потока фиксированной длины:

если обязательное значение равно false, пробелам присваивается нулевое значение поля независимо от символа заполнения.

Так что, если я правильно понимаю это предложение, это означает, что тест ниже должен пройти для этого 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 пробелов разбиты на пустые строки. Что мне не хватает? Как я могу демаршировать пробелы в пустую строку?

1 ответ

Решение

В конце концов мне удалось решить эту проблему с помощью обработчика типов, основанного на 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-users, можно также использовать trim=true, lazy=true на @Field аннотация:

    @Field(length = 5, trim = true, lazy = true) 
    String field;
Другие вопросы по тегам