XStream возвращает значение атрибута как ноль - PullRequest
0 голосов
/ 30 мая 2019

Сегодня я столкнулся со странным поведением XStream. Итак, XML:

<AddressObjectType KOD_T_ST="0" LEVEL="0" SOCRNAME="blabla"/>

Класс Java:

@XStreamAlias("AddressObjectType")
public class AddressObjectType {

    @XStreamAsAttribute
    @XStreamAlias("KOD_T_ST")
    private Integer id;

    @XStreamAsAttribute
    @XStreamAlias("SOCRNAME")
    private String name;

    @XStreamAsAttribute
    @XStreamAlias("SCNAME")
    private String shortName;

    @XStreamAsAttribute
    @XStreamAlias("LEVEL")
    private int level;
    // . . . getters, setters
}

У меня проблема только с атрибутом KOD_T_ST. Во время десериализации всегда выдает com.thoughtworks.xstream.converters.ConversionException, а причина - NullPointerException. Значение атрибута всегда null. Даже я переключаю тип с Integer на String. Что здесь происходит? Есть ли в XStream какие-либо ограничения для псевдонимов? Как прочитать значение?

XStream версия 1.4.11.1.

Большое спасибо за вашу помощь и наилучшие пожелания.

1 Ответ

1 голос
/ 30 мая 2019

Существует проблема с существующей XML-строкой

<AddressObjectType KOD_T_ST="0" LEVEL="0" SOCRNAME="blabla"/>

Вместо того, чтобы использовать вышеупомянутое, используйте приведенное ниже, оно будет работать, в объектной модели AddressObjectType нет никаких изменений.Отметьте разницу, в предоставленном мною xml есть двойное подчеркивание (__).

<AddressObjectType KOD__T__ST="0" LEVEL="0" SOCRNAME="blabla"/>

Чтобы понять, см. Ссылку ниже.http://x -stream.github.io / faq.html # XML_double_underscores

Цитируя,

Почему имена полей внезапно имеют двойные подчеркивания в сгенерированномXML?XStream сопоставляет имена классов Java и имена полей с тегами или атрибутами XML.К сожалению, это отображение не может быть 1: 1, поскольку некоторые символы, используемые для идентификаторов в Java, недопустимы в именах XML.Поэтому XStream использует XmlFriendlyNameCoder для замены этих символов заменой.По умолчанию этот NameCoder использует подчеркивание в качестве escape-символа и поэтому должен также экранировать само подчеркивание.Вы можете предоставить другой сконфигурированный экземпляр XmlFriendlyNameCoder или полностью другую реализацию, такую ​​как NoNameCoder, чтобы вообще запретить кодирование имени.Однако вы обязаны убедиться, что полученные имена действительны для XML.

...