Атрибут «пустой» не работает, как ожидалось, с помощью SimpleFramework

Поэтому я пытался установить пустой атрибут, когда элемент не имеет значения.

Поэтому мой класс выглядит так:

@Order(attributes = { "name" }) public class TypeNumber { @Attribute(required = false) protected String name; @Element(required = false) @Attribute(empty = "xsi:nil=\"true\"") protected BigDecimal value; //getter setter methods goes here } 

В случае пустого значения я ожидал выход:

 <field name="some_name"> <value xsi:nil="true"/> </field> 

Хотя фактический результат:

 <field name="some_name"/> 

Любая идея, почему пустой атрибут работает не так, как ожидалось? Или я делаю это неправильно?

Примечание. Я использую SimpleFramework XML с VisitorStrategy . Таким образом, нельзя использовать AnnotationStrategy . Также у меня есть пользовательский посетитель для чтения и записи узлов.

Вам понадобится пользовательский конвертер …

Сейчас ваши выходы:
<typeNumber name="original" value="10"/>
а также
<typeNumber name="original_empty" value="xsi:nil=&quot;true&quot;"/>

Давайте начнем!

Первое, что вам нужно сделать, это передать AnnotationStrategy конструктору вашей Persister:

Serializer serializer = new Persister(new AnnotationStrategy());

.. затем создайте собственный конвертер в своей модели:

 @Root(name = "TypeNumberFixed") @Order(attributes = {"name"}) @Convert(TypeNumberFixed.FixConverter.class) class TypeNumberFixed { @Attribute(required = false) protected String name; @Element(required = false, name = "value") protected BigDecimal value; public static class FixConverter implements Converter<TypeNumberFixed> { @Override public TypeNumberFixed read(InputNode inputNode) throws Exception { //Implement your own deConverter return null; } @Override public void write(OutputNode node, TypeNumberFixed value) throws Exception { node.setAttribute("name",value.name); OutputNode valueNode = node.getChild("value"); if (value.value != null) { valueNode.setValue(value.value.toPlainString()); } else { valueNode.setAttribute("xsi:nil", "true"); } } } } 

Это будет генерировать следующий вывод для пустых / непустых значений соответственно:

TypeNumberFixed.value = null :

 <TypeNumberFixed name="new_empty"> <value xsi:nil="true"/> </TypeNumberFixed> 

TypeNumberFixed.value = 30 :

 <TypeNumberFixed name="new"> <value>30</value> </TypeNumberFixed> 

Вот репо, если вам интересно.

Intereting Posts
Как проверить статус видимости EditText в android? DispatchTouchEvent во Фрагменте в Android Всплывающее меню Android со значками (аналогично Google Map app версии 6) Admob: Как загрузить AdRequest вне темы пользовательского интерфейса? Проблема совместимости с градиентом – ICS по умолчанию уменьшает количество цветов, чем все предыдущие версии Android Изображения загружаются быстрее в webview Панель действий Android: изменение цвета кнопок действий Как установить цвет фона для Textview программно для другого xml-файла? «Не удается получить провайдер com.google.firebase.provider.FirebaseInitProvider» Ошибка пути Android Android – OpenGL ES 2.0: эмулятор (работает) – устройство (не) Почему анимации просмотра иногда обрезаются? Возможно ли иметь доступ к галерее Facebook и позволить пользователю выбрать изображение? Как извлечь атрибут name из массива строк? Реализация сервисов google play в android Как обрабатывать устаревшие записи кеша в мобильном приложении