Может ли наследование Java быть скрытым / сплющенным при сортировке в XML с использованием MOXy? - PullRequest
1 голос
/ 26 апреля 2011

Возможно ли с помощью JAXB, возможно, с использованием MOXy, «сгладить» базовый класс в его подкласс при маршалинге, чтобы наследование Java не было видно в XML? У нас есть много созданных вручную классов, которые основаны 1: 1 на сгенерированных классах - базовый класс не имеет значения в XML.

Если это не очевидно, мы используем функцию schemagen - начиная с Java, создавая схему.

1 Ответ

2 голосов
/ 26 апреля 2011

Вы можете пометить базовый класс с помощью @XmlTransient.

@XmlTransient
public class Root {
}

Это заставит дочерний класс игнорировать наследование (WRT JAXB):

public class Child extends Root {
}

Другие примеры см .:

<Ч />

Последующий выпуск

Проблема, которую вы разместили на форуме, является ошибкой. Вы можете обойти это, используя файл привязки, как показано ниже:

связывании-a.xml

В файле привязки укажите имя типа для временного класса. Этот тип не будет отображаться в сгенерированной XML-схеме:

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="example.a">
    <java-types>
        <java-type name="MyOwnGrandpa" xml-transient="true">
            <xml-type name="MyOwnGrandpa2"/>
        </java-type>
    </java-types>
</xml-bindings>

example.a.MyOwnGrandpa

package example.a;

public class MyOwnGrandpa {

}

example.b.MyOwnGrandpa

package example.b;

public class MyOwnGrandpa extends example.a.MyOwnGrandpa {

}

example.Demo

package example;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

import org.eclipse.persistence.jaxb.JAXBContextFactory;

import example.b.MyOwnGrandpa;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, new File("src/exanmple/a/binding-a.xml"));
        JAXBContext jc = JAXBContext.newInstance(new Class[] {MyOwnGrandpa.class} , properties);
        jc.generateSchema(new MySOR());
    }

    private static class MySOR extends SchemaOutputResolver {

        @Override
        public Result createOutput(String arg0, String arg1) throws IOException {
            StreamResult result = new StreamResult(System.out);
            result.setSystemId(arg1);
            return result;
        }
    }

}

Сгенерированная схема

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:complexType name="myOwnGrandpa"/>
</xsd:schema>
<Ч />

UPDATE

Этот вопрос также обсуждается на форуме EclipseLink:

...