2011-11-18 56 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的通用方式?

回答