如何创建采用通用对象的JAXB Marshaller

时间:2019-11-20 08:16:47

标签: java xml jaxb

基本上,我想做的是创建一个编组器,该编组器可以接受我给它的任何类对象,例如汽车对象或人对象,并且必须返回XML字符串。

这是到目前为止我得到的:

 public <T> String CreateXML(T objToSerialize)
    {
        String xml = "";
        try 
        {           

        JAXBContext context = JAXBContext.newInstance(objToSerialize.getClass());
        Marshaller marshaler = context.createMarshaller(); 
        StringWriter writer = new StringWriter();
        marshaler.marshal(objToSerialize.getClass(),writer);
        xml = writer.toString();
            System.out.println(xml);
            return xml;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return xml;
    }

它给我以下错误:

  

警告:发生了非法的反射访问操作

2 个答案:

答案 0 :(得分:2)

在您的代码中,封送objectToSerialize的类 而不是对象本身。 您可以更改此行

 marshaler.marshal(objToSerialize.getClass(),writer);
 //to
 marshaler.marshal(objToSerialize,writer);

或尝试以下代码:

public static <T> String marshall(T data) {
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(data.getClass());
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        StringWriter stringWriter=new StringWriter();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
        jaxbMarshaller.marshal(data, stringWriter);
        return stringWriter.toString();
    } catch (JAXBException e) {
        e.printStackTrace();
    }
    return null;
}

答案 1 :(得分:0)

对于通用转换,试试这个:

StringWriter sw = new StringWriter();
JAXBContext.newInstance(((JAXBElement) argument).getDeclaredType()).createMarshaller().marshal(argument, sw);
sb.append(sw.toString());