2013-11-22 2 views
2

У меня есть привязки файла со следующим содержимым:EclipseLink Moxy: Подавить XSI: тип, когда сортировочная

<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 был там, как я могу подавить это при сортировке?

ответ

1

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

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

Пример


ОБНОВЛЕНИЕ

Спасибо. Теперь я сделал суперкласс XmlTransient, который также создает xsi: type. Я использовал аннотацию для этого. Есть ли на самом деле способ использования для создания java-типа be переходный? Я мог бы заставить его работать только для 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> 

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

+1

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

+0

@hansi - Я обновил свой ответ с этой информацией. –

0

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

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

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

Я только добавил @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-апи версии больше чем 2.1 или используйте мой метод, если у вас есть EclipseLink MOXy.

Смежные вопросы