JAXB Marshalling с нулевыми полями
Это довольно простой запрос, но я просто не нашел способ сделать это.
В основном я пытаюсь настроить роль в JAXB, который говорит, что всякий раз, когда встречается нулевое поле, вместо того, чтобы игнорировать его на выходе, установите его на пустое значение. Итак, для класса:
@XMLRootElement
Class Foo {
Integer num;
Date date;
….
}
Когда это было отправлено в файл XML, если поле даты равно null, мой вывод не содержит этого элемента. То, что я хочу сделать, это включить все поля в вывод; и если они равны нулю, замените их - скажем, пробелом. Таким образом, выход должен быть:
<foo>
<num>123</num>
<date></date>
</foo>
Спасибо,
Jalpesh.
Ответы
Ответ 1
Спасибо, ребята, за ваши ответы.
Крис Дэйл - я пробовал ваш подход, и он действительно не делал то, что я хотел. JAXB по-прежнему игнорировал мои нулевые значения, несмотря на определение значения по умолчанию для моих полей.
Я наткнулся на ответ после того, как кто-то из форумов в Джерси указал мне на раздел документации 2.2.12.8 Нет значения.
В принципе, все, что мне нужно было сделать, это добавить в мои поля следующее:
@XmlElement(nillable = true)
Как только я добавил, JAXB будет отображать эти поля при их сортировке по XML следующим образом:
...
<num>5</num>
<date xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
....
Ответ 2
Но но но... пустая строка не является допустимым лексическим представлением для даты, поэтому вы не можете этого сделать. то есть, если вы создали XML-документ с пустым значением для поля даты, он не будет корректно проверяться.
Другими словами, если ваш элемент date
имеет minOccurs
из 1 или более, а не nillable
, то у вас обязательно должны быть (1 или более) даты, которые не могут быть пустыми (или пробелами, или другие незначения).
Ответ 3
Как указано в другом ответе, оно недействительно, так как оно не является допустимой датой. У меня была аналогичная проблема, с которой я хотел справиться (особенно). Поскольку вы не можете использовать null, вы можете использовать механизм значений по умолчанию в JAXB. Следующее значение будет установлено по умолчанию, если ни один не указан. Вы можете через код обнаружить эту специальную дату и обработать этот случай исключения.
@XmlElement(defaultValue="1970-01-01T00:00:00.0-00:00")
Таким образом, можно определить и удалить значение даты, но вы просто не можете использовать null для этого.
Ответ 4
В MOXy вы можете указать, как jsonProvider должен выполнить свою работу для JAXB.
Итак, когда вы делаете JAX-RS, добавьте следующий код в свой класс, полученный из приложения
Я использовал этот код на Tomcat 7 с хорошими результатами. (eclipselink 2.4.1)
@ApplicationPath("/rest")
public class RestApplication extends Application
{
...
public Set< Object> getSingletons()
{
HashSet<Object> set = new HashSet<Object>(1);
set.add( newMoxyJsonProvider());
return set;
}
public static MOXyJsonProvider newMoxyJsonProvider()
{
MOXyJsonProvider result = new MOXyJsonProvider();
//result.setAttributePrefix("@");
result.setFormattedOutput( false);
result.setIncludeRoot( false);
result.setMarshalEmptyCollections( true);
//result.setValueWrapper("$");
return result;
}
В Glassfish 3.1.2 и WAS 8.5, однако, newMoxyJsonProvider() не требуется, но затем поставщик JAXB настраивается сервером.
В случае Glassfish, который поставляется с MOXy, я видел те же проблемы с нулевыми значениями.
Пока не проверял, но угадайте, что ответ заключается в настройке JAXB на уровне сервера приложений, если это возможно вообще.