從java.lang.UnsupportedOperationException看WebLogic WS*協議棧的變遷
之前,有些朋友從開源的WS*應用(比如說Axis、CXF)遷移到WebLogic 9、10上,經常遇到類似下面的異常:
????????at?weblogic.webservice.core.soap.SOAPElementImpl.getElementQName(SOAPElementImpl.java: 651 )
????????at?org.springframework.ws.soap.saaj.Saaj13Implementation.getName(Saaj13Implementation.java: 67 )
????????at?org.springframework.ws.soap.saaj.SaajSoapEnvelope.getBody(SaajSoapEnvelope.java: 49 )
????????at?org.springframework.ws.soap.AbstractSoapMessage.getSoapBody(AbstractSoapMessage.java: 35 )
????????at?org.springframework.ws.soap.AbstractSoapMessage.getPayloadResult(AbstractSoapMessage.java: 56 )
這有一些歷史因素在內,WebLogic 8.1的WebService協議棧,包含在weblogic.jar中。
SOAP棧的全部實現,都在weblogic.webservice.core.soap.* 這個Package中。
進入了Java5的時代后,JWS依靠Annotation方式,已經徹底改變WebService編程的外觀,于是,隨之而來的是,基于Java5的WebLogic 9/10,基本上使用Sun JWS方式實現Web Services,且WebLogic開始兼容新的WS* API,WebLogic的做法是deprecated以前的WS API(weblogic.webservice.core.soap.*),但為了8.1應用升級的兼容性考慮,用戶依然使用較舊的包。
比如上述的NotSupport異常,在默認的WebLogic 9、10中%BEA_HOME%\modules\com.bea.core.weblogic.saaj_1.0.1.0.jar其實是Support的。
對WebLogic 8.1老用戶來說,他們的WS*應用無需重新編碼即可運行在WebLogic 9.2,此時默認使用老的協議棧【weblogic.webservice.core.soap.*】
對WebLogic 9.2新用戶來說,他們也可以使用老協議棧,也可以使用新的協議棧,使用【weblogic.xml.saaj.*】
針對上述的NotSupport異常,有兩種方式可以讓應用使用新的API實現:
?System.setProperty("javax.xml.soap.MessageFactory",??"weblogic.xml.saaj.MessageFactoryImpl");
-Djavax.xml.soap.MessageFactory=weblogic.xml.saaj.MessageFactoryImpl
SAAJ? 1.1
The?actual? class / method?in?question?is?javax.xml.soap.Text.isComment(),?which?
appears?to?be?implemented?by?
weblogic.webservice.core.soap.SOAPTextElement.isComment().
Stack?trace?is?as?follows:?
DemoServlet?received?an?unexpected?exception:?
java.lang.UnsupportedOperationException:?This? class ?does?not?support?SAAJ? 1.1
java.lang.UnsupportedOperationException:?This? class ?does?not?support?SAAJ? 1.1
????????at?
weblogic.webservice.core.soap.SOAPTextElement.isComment(SOAPTextElement.java: 43 )
????????at?
com.company.demo.servlet.DemoServlet.treeWalk(DemoServlet.java: 209 )
????????at?
com.company.demo.servlet.DemoServlet.treeWalk(DemoServlet.java: 225 )
????????at?
com.company.demo.servlet.DemoServlet.treeWalk(DemoServlet.java: 225 )
????????at?
com.company.demo.servlet.DemoServlet.treeWalk(DemoServlet.java: 225 )
????????at?
com.company.demo.servlet.DemoServlet.treeWalk(DemoServlet.java: 225 )
????????at?
com.company.demo.servlet.DemoServlet.treeWalk(DemoServlet.java: 225 )
????????at?
com.company.demo.servlet.DemoServlet.treeWalk(DemoServlet.java: 225 )
????????at?
com.company.demo.servlet.DemoServlet.treeWalk(DemoServlet.java: 225 )
????????at?
com.company.demo.servlet.DemoServlet.doGetOrPost(DemoServlet.java: 119 )
????????at?com.company.demo.servlet.DemoServlet.doGet(DemoServlet.java: 44 )
????????at?javax.servlet.http.HttpServlet.service(HttpServlet.java: 743 )
????????at?javax.servlet.http.HttpServlet.service(HttpServlet.java: 856 )
????????at?
weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java: 225 )
????????at?
weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java: 127 )
????????at?
weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java: 283 )
????????at?
weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java: 175 )
????????at?
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java: 3214 )
????????at?
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java: 321 )
????????at?
weblogic.security.service.SecurityManager.runAs(SecurityManager.java: 121 )
????????at?
weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java: 1983 )
????????at?
weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java: 1890 )
????????at?
weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java: 1344 )
????????at?weblogic.work.ExecuteThread.execute(ExecuteThread.java: 209 )
????????at?weblogic.work.ExecuteThread.run(ExecuteThread.java: 181 )
很好,因為它們使用了更多的API,這些API在WebLogic的老協議棧【weblogic.webservice.core.soap.*】中沒有被支持,使用新的即可。
我一般在重啟WebLogic的時候,在startWebLogic.sh腳本中加入:
-Djavax.xml.soap.MessageFactory=weblogic.webservice.core.soap.MessageFactoryImpl -Djavax.xml.soap.SOAPFactory=weblogic.webservice.core.soap.SOAPFactoryImpl
posted on 2008-07-11 08:29 david.turing 閱讀(5666) 評論(4) 編輯 收藏 所屬分類: SOA/WebService