Jaxb 当使用MOXy编组为XML时,Java继承是否可以隐藏/展平?

Jaxb 当使用MOXy编组为XML时,Java继承是否可以隐藏/展平?,jaxb,eclipselink,moxy,Jaxb,Eclipselink,Moxy,是否可以使用JAXB(可能使用MOXy)在编组中将基类“展平”为其子类,从而使Java继承在XML中不可见?我们有许多手工创建的类,它们是基于生成的类1:1创建的——基类在XML中没有任何价值 如果不明显,我们使用的是schemagen特性–从Java开始,创建一个模式。您可以使用标记基类 这将导致子类忽略继承(WRT JAXB): 有关其他示例,请参见: 后续问题 你在论坛上发布的问题是一个bug。您可以使用如下绑定文件解决此问题: binding-a.xml 在绑定文件中,为瞬态类指

是否可以使用JAXB(可能使用MOXy)在编组中将基类“展平”为其子类,从而使Java继承在XML中不可见?我们有许多手工创建的类,它们是基于生成的类1:1创建的——基类在XML中没有任何价值


如果不明显,我们使用的是schemagen特性–从Java开始,创建一个模式。

您可以使用标记基类

这将导致子类忽略继承(WRT JAXB):

有关其他示例,请参见:


后续问题

你在论坛上发布的问题是一个bug。您可以使用如下绑定文件解决此问题:

binding-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>
示例。b.b

package example.a;

public class MyOwnGrandpa {

}
package example.b;

public class MyOwnGrandpa extends example.a.MyOwnGrandpa {

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

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;
        }
    }

}
包示例;
导入java.io.File;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.Map;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.SchemaOutputResolver;
导入javax.xml.transform.Result;
导入javax.xml.transform.stream.StreamResult;
导入org.eclipse.persistence.jaxb.JAXBContextFactory;
导入示例b.b;
公开课演示{
公共静态void main(字符串[]args)引发异常{
映射属性=新的HashMap(1);
put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY,新文件(“src/exanmple/a/binding-a.XML”);
JAXBContext jc=JAXBContext.newInstance(新类[]{myownggrandge.Class},属性);
jc.generateSchema(newmysor());
}
私有静态类MySOR扩展SchemaOutputResolver{
@凌驾
公共结果createOutput(字符串arg0、字符串arg1)引发IOException{
StreamResult结果=新的StreamResult(System.out);
结果:设置系统ID(arg1);
返回结果;
}
}
}
生成的模式

package example.a;

public class MyOwnGrandpa {

}
package example.b;

public class MyOwnGrandpa extends example.a.MyOwnGrandpa {

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


更新

EclipseLink论坛也在讨论这个问题:


Blaise,感谢您的快速响应。对不起,我想你可能误解了。我不希望父类的属性消失——只希望类本身消失。父类的公共属性应该看起来像是在子类中声明的一样。@Ed Staub-这就是注释父类@xmltransive所要做的。非常感谢。不幸的是,由于父项和子项具有相同的名称(在不同的包中),因此遇到了问题。请参阅。@Ed Staub-您在论坛上提到的问题是一个bug,以上是解决该问题的方法。