EclipseLink MOXy: подавлять xsi:type при сортировке.

У меня есть файл привязок со следующим содержимым:

<java-type name="JavaType">
  <xml-root-element name="root"/>
  <java-attributes>
    ...
  </java-attributes>
</java-type>

Когда я упорядочиваю класс JavaType, используя эту привязку, XML выглядит так:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="JavaType">

Я не хочу, чтобы xsi:type был там, как я могу подавить это при сортировке?


person hansi    schedule 22.11.2013    source источник


Ответы (2)


Атрибут xsi:type появится, когда вы упорядочиваете подкласс. Вы можете подавить его, обернув свой объект в JAXBElement, который предоставляет информацию о корневом элементе, включая тип.

JAXBElement<JavaType> je = new JAXBElement(new QName(), JavaType.class javaType);
marshaller.marshal(je, System.out); 

Пример


ОБНОВЛЕНИЕ

Спасибо. Теперь я создал суперкласс XmlTransient, который также приводит к исчезновению типа xsi:. Я использовал аннотацию, чтобы сделать это. Есть ли способ сделать java-тип временным? Я мог заставить его работать только для java-атрибутов.

Ты прав. Вы можете использовать @XmlTransient на уровне класса, чтобы удалить его из иерархии наследования. Ниже показано, как это можно сделать с помощью внешнего документа сопоставления MOXy.

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    package-name="com.example.foo">
     <java-types>
        <java-type name="Foo" xml-transient="true"></java-type>
     </java-types>
</xml-bindings>

Для получения дополнительной информации

person bdoughan    schedule 22.11.2013
comment
Спасибо. Теперь я создал суперкласс XmlTransient, который также приводит к исчезновению типа xsi:. Я использовал аннотацию, чтобы сделать это. Есть ли способ использовать ‹xml-transient .../›, чтобы сделать java-тип переходным? Я мог заставить его работать только для java-атрибутов. - person hansi; 22.11.2013

Я попробовал предложение @blaise-doughan и добавил аннотацию @XmlTransient в начало моего абстрактного базового класса.

В моей среде (поэтому мой продукт строго зависит от чего-то) библиотека jaxb-api говорит: «Аннотация @XmlTransient запрещена для этого местоположения» из-за ее версии, вероятно, высокой старше 2.1. Я понял это, когда попытался добавить аннотацию с новым тестовым путем к классу, который содержит версию >=2.1, поэтому он позволяет определить его поверх класса.

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

Я только добавил @XmlDiscriminatorNode("") в начало моего базового класса и предположил, что вы используете EclipseLink MOXy:

import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;

@XmlDiscriminatorNode("")
public abstract class Base {

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

Подводя итог, вы можете использовать @XmlTransient, если у вас версия jaxb-api выше 2.1, или использовать мой метод, если у вас есть EclipseLink MOXy.

person okanozeren    schedule 26.12.2014