Подтвердить что ты не робот

JAXB Marshalling с нулевыми полями

Это довольно простой запрос, но я просто не нашел способ сделать это.

В основном я пытаюсь настроить роль в JAXB, который говорит, что всякий раз, когда встречается нулевое поле, вместо того, чтобы игнорировать его на выходе, установите его на пустое значение. Итак, для класса:

@XMLRootElement
Class Foo {
   Integer num;
   Date date;
….
}

Когда это было отправлено в файл XML, если поле даты равно null, мой вывод не содержит этого элемента. То, что я хочу сделать, это включить все поля в вывод; и если они равны нулю, замените их - скажем, пробелом. Таким образом, выход должен быть:

<foo>
  <num>123</num>
  <date></date>
</foo>

Спасибо,

Jalpesh.

4b9b3361

Ответ 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 на уровне сервера приложений, если это возможно вообще.