2011-04-25 62 views
1

是否有可能使用JAXB,可能使用MOXy在編組中將基類「扁平化」成其子類,以便Java繼承在XML中不可見?我們有許多手工創建的類,它們基於生成的類的1對1 - 基類在XML中沒有任何價值。使用MOXY編組XML時,Java繼承可以隱藏/展平嗎?

如果不明顯,我們使用schemagen功能 - 從Java開始,創建一個模式。

回答

2

您可以用@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的論壇討論這個問題:

+0

Blaise,感謝您的快速響應。對不起,我想你可能會誤解。我不希望父類的_properties_消失 - 只有類本身。父類的公共屬性應該看起來好像它們是在子類中聲明的。 – 2011-04-25 22:39:05

+0

@Ed Staub - 這是註釋父類@XmlTransient將做的事情。 – 2011-04-25 22:53:20

+0

非常感謝。不幸的是,由於父母和孩子擁有相同的姓名(在不同的軟件包中),因此遇到了困難。參見[論壇](http://www.eclipse.org/forums/index.php?t=thread&frm_id=111&S=2af69206a1800ca98b87f0bd088b3c89)。 – 2011-04-26 19:26:11