Атрибут «пустой» не работает, как ожидалось, с помощью 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
Обеспечение правильной даты / времени Как создать виджет на главном экране Android? Синхронизировать положение прокрутки ScrollView по всем фрагментам внутри ViewPager Однократное черное мерцание при добавлении GLSurfaceView Как открыть файл, не зная его расширения, но зная полное имя? Не удалось выполнить выполнение Gradle (новый проект) – java home different Как использовать Canvas для слияния двух изображений в Android? Как создать диагональную границу в React Native? Инструменты тестирования производительности для собственных мобильных приложений в iOS и Android Android – отправка сообщения обработчику мертвой нити, ошибка Toast Практическое использование @Ignore в королевстве? Запись с большим объемом в Android Android-словарь для Android – проверка орфографии – Android Studio Какова цель «FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET» при совместном использовании? Время, которое требуется, чтобы увидеть мое первое приложение для Android на рынке после публикации