[Axis2]org.apache.axiom.om.NodeUnavailableException
問(wèn)題的起因是修改了Axis2自動(dòng)生成的代碼,以便在后臺(tái)打印出請(qǐng)求和響應(yīng)的格式
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);}} }雖然后臺(tái)能夠打印出請(qǐng)求,但是在打印響應(yīng)時(shí)卻會(huì)拋出異常:org.apache.axiom.om.NodeUnavailableException
主要還是代碼修改的有問(wèn)題,AXIS2的版本為1.6.2,在其lib包中的AXIOM版本為1.2.13,在我的工程中將其換為1.2.14
在AXIOM1.2.14的API中(參見(jiàn):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對(duì)象后,調(diào)用了fromOM方法獲得結(jié)果對(duì)象,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的類(lèi)型是org.apache.axiom.soap.SOAPEnvelope,而org.apache.axiom.soap.SOAPEnvelope是org.apache.axiom.om.OMContainer的子類(lèi)
所以在finally塊中調(diào)用_returnEnv.toString()時(shí),由于_returnEnv中保存的節(jié)點(diǎn)因?yàn)楸籓MContainer.getXMLStreamReaderWithoutCaching()方法消費(fèi)而變得不可用,所以將拋出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);}} }?
總結(jié)
以上是生活随笔為你收集整理的[Axis2]org.apache.axiom.om.NodeUnavailableException的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: git 撤销上次提交 commit
- 下一篇: 实习 | 深圳市彼岸心智科技有限公司招募