Маршаллинг / Unmarshalling нули в JAXB - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть несколько рукописных классов Java на сервере REST, который использует JAXB для маршалинга / демаршаллинга из XML (JAX-RS).

Я реализовал небольшую иерархию классов, заимствованную из Scala: Option<T>, Some<T> и None<T>, и хотел бы использовать их в моей модели, чтобы отличать отсутствующие значения от null значений в XML.

Например, в следующем XML-файле значение phone_number отсутствует, и соответствующее поле модели Java должно быть установлено на None:

<person>
  <last_name>Jones</last_name>
  <first_name>Abe</first_name>
</person>

class Person {
  @XmlElement("last_name")
  Option<String> lastName;

  @XmlElement("first_name")
  Option<String> firstName;

  @XmlElement("phone_number")
  Option<String> phoneNumber;
}

, тогда как в этом сообщении XML для phone_number должно быть установлено значение new Some(null):

<person>
  <last_name>Jones</last_name>
  <first_name>Abe</first_name>
  <phone_number></phone_number>
</person>

Я понимаю, что с помощью этой схемы я не могу отличить строку нулевой длины от пустой строки.

Я думал об использовании @XmlJavaTypeAdapter, но у меня есть много классов моделей, и я предпочел бы использовать «централизованное» решение, которое работает для всех классов.

Я считаю, что правильное решение предполагает использование MessageBodyWriter и MessageBodyReader, но я все еще хочу, чтобы встроенный механизм обрабатывал каждый из классов; Я буду обрабатывать отдельные поля (включая строку и дату).

1 Ответ

0 голосов
/ 08 ноября 2011

Вы всегда можете установить для атрибутов класса Person значения по умолчанию. Если по умолчанию PhoneNumber установлено значение «Нет», сохранение его в XML даст следующий тег

 <phone_number>None</phone_number>

В любом случае атрибут PhoneNumber останется равным «Нет», пока вы не вызовете установщик, чтобы установить реальное значение телефонного номера.

Надеюсь, это поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...