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;