Как преобразовать 0 в ноль с помощью BeanIO

Мой вопрос: как преобразовать целочисленное значение 0 в null? Ранее я использовал аннотацию Xmappr, и она хорошо работала с этой аннотацией:

@Text 

Теперь мне нужно использовать BeanIO, поэтому я попробовал:

@Field(xmlType=XmlType.Text) 

и это не работает.

Для успешного выполнения модульного теста необходимо прочитать число из XML-файла. Если personNumber из XML равен 0, он должен быть записан в массиве как null. В этом случае массив должен выглядеть так: [1,2,null].

XML-файл:

<Person ...> 1 </Person>
.
.
<Person ...> 2 </Person>
.
.
<Person ...> 0 </Person>

Ранее аннотация в Java:

@Text
private Integer personNumber;

Аннотации в Java сейчас:

@Field(xmlType=XmlType.Text)
private Integer personNumber;

Может быть дело в том, что я должен указать формат в аннотации поля:

@Field(xmlType=XmlType.Text, format=....)
private Integer personNumber;

Если да, то какой формат указать?


person Ensz    schedule 17.10.2017    source источник
comment
Вы пытались установить nillable в true? beanio.org/2.1/docs/api/ org/beanio/аннотация/   -  person OH GOD SPIDERS    schedule 17.10.2017
comment
Действительно ли 0 эквивалентно null? Если ваш XML не должен содержать номер человека, то почему тело тега <Person> не пусто?   -  person Thomas    schedule 17.10.2017
comment
@OHGODSPIDERS Я пытался, но получил ошибку: xmLType 'текст' не может быть обнулён   -  person Ensz    schedule 17.10.2017
comment
@Thomas XML должен быть таким же, как и раньше, когда были аннотации xmappr, с этим ничего нельзя поделать. Эта часть с ‹Person› ‹/Person› — лишь малая часть :/   -  person Ensz    schedule 17.10.2017
comment
Я не знаком с bean-io, но я предполагаю, что он может вызывать сеттеры, если они присутствуют. В этом случае вы могли бы обрабатывать 0 там. В качестве альтернативы, если вы хотите использовать формат (хотя я не уверен, что произойдет при нарушении), вам, вероятно, понадобится регулярное выражение, которое тогда будет чем-то вроде ^[1-9][0-9]*$, т.е. числом, начинающимся с цифры больше 0 и за которым следует любое количество цифр (включая 0).   -  person Thomas    schedule 17.10.2017


Ответы (1)


Вы можете попробовать использовать пользовательское значение от org.beanio.types.IntegerTypeHandler до return null, когда число равно '0'. Что-то вроде этого:

import org.beanio.types.IntegerTypeHandler;

public class IntegerToNullTypeHandler extends IntegerTypeHandler {

  /**
   * {@inheritDoc}
   * @see org.beanio.types.IntegerTypeHandler#createNumber(java.lang.String)
   */
  @Override
  protected Integer createNumber(String text) throws NumberFormatException {
    if (text != null && "0".equals(text)) {
      return null;
    }
    return super.createNumber(text);
  }
}

Чтобы использовать этот TypeHandler, измените поле, в котором вы хотите использовать TypeHandler, на:

@Field(xmlType=XmlType.Text, handlerClass=IntegerToNullTypeHandler.class)
private Integer personNumber;

Я не проверял это, но это должно работать.

person nicoschl    schedule 17.10.2017