1
是否有可能使用JAXB,可能使用MOXy在編組中將基類「扁平化」成其子類,以便Java繼承在XML中不可見?我們有許多手工創建的類,它們基於生成的類的1對1 - 基類在XML中沒有任何價值。使用MOXY編組XML時,Java繼承可以隱藏/展平嗎?
如果不明顯,我們使用schemagen功能 - 從Java開始,創建一個模式。
是否有可能使用JAXB,可能使用MOXy在編組中將基類「扁平化」成其子類,以便Java繼承在XML中不可見?我們有許多手工創建的類,它們基於生成的類的1對1 - 基類在XML中沒有任何價值。使用MOXY編組XML時,Java繼承可以隱藏/展平嗎?
如果不明顯,我們使用schemagen功能 - 從Java開始,創建一個模式。
您可以用@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的論壇討論這個問題:
Blaise,感謝您的快速響應。對不起,我想你可能會誤解。我不希望父類的_properties_消失 - 只有類本身。父類的公共屬性應該看起來好像它們是在子類中聲明的。 – 2011-04-25 22:39:05
@Ed Staub - 這是註釋父類@XmlTransient將做的事情。 – 2011-04-25 22:53:20
非常感謝。不幸的是,由於父母和孩子擁有相同的姓名(在不同的軟件包中),因此遇到了困難。參見[論壇](http://www.eclipse.org/forums/index.php?t=thread&frm_id=111&S=2af69206a1800ca98b87f0bd088b3c89)。 – 2011-04-26 19:26:11