2011-11-18 136 views
1

我想直接從XML字符串中反序列化(解組)POJO,而不需要任何配置(模式定義或其他)文件。動態JAXB XML反序列化(解組)

我的應用程序使用一個簡單的抽象基類Field如下:

public abstract class Field 
{ 
    private final String name; 
    private final Object value; 

    protected Field(String name, Object value) 
    { 
     this.name = name; 
     this.value = value; 
    } 
} 

其通過各種其他類擴展,如

public class StringField extends Field 
{ 
    public StringField(String name, String value) 
    { 
     super(name, value); 
    } 
} 

注意,沒有無參數構造上任何這些類。

中的序列StringField POJO看起來像

<StringField> 
    <name>test</name><type /> 
    <value>Some text</value> 
</StringField> 

假設上述XML存儲在名爲xml,我試圖用JAXB反序列化一個字符串變量,通過下面的方法:

public static Field deserialize(String xml) 
{ 
    Field field = null; 

    try 
    { 
     JAXBContext context = JAXBContext.newInstance(Field.class); 

     javax.xml.bind.Unmarshaller um = context.createUnmarshaller(); 

     field = (Field)um.unmarshal(new StringReader(xml)); 
    } 
    catch (JAXBException e) 
    { 
     e.printStackTrace(); 
    } 

    return field; 
} 

理想情況下,我希望將XML字符串反序列化到適當的Java POJO(即上面案例中的StringField)中。

但是,我得到JAXB異常,因爲Field沒有無參數構造函數,即使我在那裏放置一個,因爲它不能被實例化。

但即使我將Field類設置爲非抽象,通過默認構造函數分配給2個字段(name,value)的值是主要的值,而不是從XML字符串反序列化的實際值。即使這有效,我不會得到一個子對象(StringField),但是一個父對象(Field)。

是否有任何動態反序列化POJO,沒有模式聲明,並獲得實際(子)對象使用JAXB的通用方式?

回答