2014-10-02 74 views
6

当我运行编组操作我得到以下错误:与JAXB,元帅,问题 - 不能编组类型“java.lang.String中”

javax.xml.bind.MarshalException 
- with linked exception: 
[com.sun.istack.internal.SAXException2: unable to marshal type "java.lang.String" as an element because it is missing an @XmlRootElement annotation] 
    ... 

Caused by: com.sun.istack.internal.SAXException2: unable to marshal type "java.lang.String" as an element because it is missing an @XmlRootElement annotation 
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:237) 
    at com.sun.xml.internal.bind.v2.runtime.LeafBeanInfoImpl.serializeRoot(LeafBeanInfoImpl.java:126) 
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:483) 
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308) 
    ... 6 more 

这是我编组站......

功能
public StringBuffer Marshaller(Object marshall){ // make marshalling->Java to XML 
     StringWriter writer = new StringWriter(); 
     try { 
      JAXBContext jaxbContext=JAXBContext.newInstance(marshall.getClass()); 
      Marshaller jaxbMarshaller=jaxbContext.createMarshaller(); 
      // çıktı 
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      jaxbMarshaller.marshal(marshall, writer); 
      System.out.println(writer.getBuffer().toString()); 
     } catch (PropertyException e) { 
      e.printStackTrace(); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 
     return writer.getBuffer(); 

    } 

感谢您的利益..

回答

9

你不能名帅只是一个String,因为它没有任何根元素信息(因此关于失踪异常3210注释),但您可以将其包装在JAXBElement的实例中,然后编组。 JAXBElement是将此根元素信息提供给JAXB的另一种方法。

创建JAXBElement

JAXBElement<String> jaxbElement = 
    new JAXBElement(new QName("root-element"), 
    String.class, string); 

如果您生成模式从XML模式

如果从XML架构中创建对象模型的实例。并且您有一个顶级XML元素,其数据类型为xs:string,那么将在生成的ObjectFactory类中提供一种便捷方法,该类将帮助您创建JAXBElement实例。

+0

你能解释一下吗? – 2014-10-02 18:25:16

+0

@nurdankaraman - 我已经添加了一些额外的信息给我的答案。 – 2014-10-02 18:56:57

+0

非常感谢你:) – 2014-10-03 06:15:36