У меня есть несколько рукописных классов 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
, но я все еще хочу, чтобы встроенный механизм обрабатывал каждый из классов; Я буду обрабатывать отдельные поля (включая строку и дату).