日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Axis2]org.apache.axiom.om.NodeUnavailableException

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Axis2]org.apache.axiom.om.NodeUnavailableException 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題的起因是修改了Axis2自動生成的代碼,以便在后臺打印出請求和響應的格式

public com.sean.AddResponse add(com.sean.Add add0)throws java.rmi.RemoteException {org.apache.axis2.context.MessageContext _messageContext = null;org.apache.axiom.soap.SOAPEnvelope env = null;org.apache.axiom.soap.SOAPEnvelope _returnEnv = null;try {......env = toEnvelope(getFactory(_operationClient.getOptions().getSoapVersionURI()), add0,optimizeContent(new javax.xml.namespace.QName("http://sean.com", "add")),new javax.xml.namespace.QName("http://sean.com", "add"));......_returnEnv = _returnMessageContext.getEnvelope();java.lang.Object object = fromOM(_returnEnv.getBody().getFirstElement(), com.sean.AddResponse.class,getEnvelopeNamespaces(_returnEnv));return (com.sean.AddResponse) object;} catch (org.apache.axis2.AxisFault f) {......} finally {System.out.println("request:+\n" + env.toString());System.out.println("response:\n" + _returnEnv.toString());if (_messageContext.getTransportOut() != null) {_messageContext.getTransportOut().getSender().cleanup(_messageContext);}} }

雖然后臺能夠打印出請求,但是在打印響應時卻會拋出異常:org.apache.axiom.om.NodeUnavailableException

主要還是代碼修改的有問題,AXIS2的版本為1.6.2,在其lib包中的AXIOM版本為1.2.13,在我的工程中將其換為1.2.14

在AXIOM1.2.14的API中(參見:https://ws.apache.org/axiom/apidocs/org/apache/axiom/om/NodeUnavailableException.html)提到:

Exception indicating that a requested node cannot be returned because it is no longer available. A node may become unavailable because it has been consumed by a method such asOMSerializable.serializeAndConsume(XMLStreamWriter) orOMContainer.getXMLStreamReaderWithoutCaching(), or because one of its ancestors has been discarded usingOMNode.discard().

在獲得_returnEnv對象后,調用了fromOM方法獲得結果對象,fromOM方法如下:

private java.lang.Object fromOM(org.apache.axiom.om.OMElement param,java.lang.Class type, java.util.Map extraNamespaces)throws org.apache.axis2.AxisFault {try {if (com.sean.Add.class.equals(type)) {return com.sean.Add.Factory.parse(param.getXMLStreamReaderWithoutCaching());}if (com.sean.AddResponse.class.equals(type)) {return com.sean.AddResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());}} catch (java.lang.Exception e) {throw org.apache.axis2.AxisFault.makeFault(e);}return null; }

_returnEnv的類型是org.apache.axiom.soap.SOAPEnvelope,而org.apache.axiom.soap.SOAPEnvelope是org.apache.axiom.om.OMContainer的子類

所以在finally塊中調用_returnEnv.toString()時,由于_returnEnv中保存的節點因為被OMContainer.getXMLStreamReaderWithoutCaching()方法消費而變得不可用,所以將拋出NodeUnavailableException異常

解決方式如下:

public com.sean.AddResponse add(com.sean.Add add0)throws java.rmi.RemoteException {org.apache.axis2.context.MessageContext _messageContext = null;org.apache.axiom.soap.SOAPEnvelope env = null;org.apache.axiom.soap.SOAPEnvelope _returnEnv = null;String request = "";String response = "";try {......env = toEnvelope(getFactory(_operationClient.getOptions().getSoapVersionURI()), add0,optimizeContent(new javax.xml.namespace.QName("http://sean.com", "add")),new javax.xml.namespace.QName("http://sean.com", "add"));request = env.toString();......_returnEnv = _returnMessageContext.getEnvelope();response = _returnEnv.toString();java.lang.Object object = fromOM(_returnEnv.getBody().getFirstElement(), com.sean.AddResponse.class,getEnvelopeNamespaces(_returnEnv));return (com.sean.AddResponse) object;} catch (org.apache.axis2.AxisFault f) {......} finally {System.out.println("request:+\n" + request);System.out.println("response:\n" + response);if (_messageContext.getTransportOut() != null) {_messageContext.getTransportOut().getSender().cleanup(_messageContext);}} }

?

總結

以上是生活随笔為你收集整理的[Axis2]org.apache.axiom.om.NodeUnavailableException的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。