2011-12-27 107 views
2

如何将JAXBElement作为SOAP消息的SOAPBody的子节点追加。我想做我的Web服务端点方法里面做的是:如何将JAXBElement作为SOAP消息的子节点附加到SOAP消息

SaajSoapMessage soapRequest = (SaajSoapMessage) messageContext.getRequest(); 
    SOAPBody soapBody=soapRequest.getSaajMessage().getSOAPBody(); 
    ObjectFactory of=new ObjectFactory(); 
    SplsTID tid=new SplsTID(); 
    JAXBElement<SplsTID> element=of.createSplsTID(tid); 
    element.soapBody.appendChild(element); 

然后我得到的java.lang.ClassCastException: javax.xml.bind.JAXBElement cannot be cast to org.w3c.dom.Element

我正在使用spring-WS并使用jaxb编组。我们应该怎么做?

+0

哪条线被抛出的异常?向我们展示完整的堆栈跟踪,而不仅仅是一点。 – skaffman 2011-12-27 11:58:37

+0

错误来自'element.soapBody.appendChild(element)'这一行;''元素'属于'JAXBElement'类型。下面是堆栈跟踪:'java.lang.ClassCastException:javax.xml.bind.JAXBElement不能转换为org.w3c.dom.Element \t at com.staples.onas.util.ONASUtil.createPublishLog(ONASUtil.java: 158) \t at com.staples.onas.service.endpoint.OrderNumberServiceEndPoint.processOrderNumberRequest(OrderNumberServiceEndPoint.java:73) \t at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)''。由于大小限制,我无法在此处粘贴完整的堆栈跟踪。让我知道是否需要更多细节。 – 2011-12-30 05:54:55

回答

4

基本上,你必须在你的肩膀上划伤你的屁股。

使用JAXBContext创建编组器,将其全部转换为字符串。然后将字符串转换为xml元素。

private static Element JAXBElementToDomElement(MyClassThatImTryingToConvert element) { 

    try { 
     JAXBContext jc = JAXBContext.newInstance(new Class[] { 
       MyClassThatImTryingToConvert.class, OtherJAXBClasses.class }); 
     Marshaller um = jc.createMarshaller(); 
     StringWriter sw = new StringWriter(); 

     um.marshal(element, sw); 
     InputStream is = new ByteArrayInputStream(sw.toString().getBytes()); 
     Document xmlDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is); 
     return xmlDocument.getDocumentElement(); 
    } catch (Exception ex) { 
     log.log(Level.FATAL, "can't create dom element", ex); 
    } 
    return null; 

还有一个选项。使用XmlBeans来构建你的类(这将使得使用JAXB变得困难,因此使得JAX-WS变得困难)。

+0

大声笑@表达开始这个答案:) – 2018-01-24 10:54:29

6

我认为,我想出了一个稍微更优雅的解决方案:

// Having a SOAPMessage message and a JAXBContext context... 
// Marshall the JAXB object request into to a DOM document 
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
final Marshaller marshaller = context.createMarshaller(); 
marshaller.marshal(request,document); 

// Finally attach the document to the message and save. Done! 
soapBody.addDocument(document); 
message.saveChanges();