CXF在Websphere(WAS8.5)中的异常处理及共享库配置

问题描述Spring+SpringMVC+Mybais项目中添加了一个远程接口调用的需求,框架使用CXF,本地环境为Tomcat,在开发环境测试调用不存在问题,移植到SIT环境时出现了问题,由此可以断定是不同的环境导致的影响,查询官方描述说是was中自带的一些组件jar和cxf使用的一下jar存在版本不一致,是项目在was运行中报找不到类XmlSchema的错误.


异常信息:000000b1 ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0014E: 未捕获到 service() 异常的根本原因 spring:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'blackCheckController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sinosoft.aml.application.BlackCheckService com.sinosoft.aml.interfaces.BlackCheckController.blackCheckService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'blackCheckService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sinosoft.aml.interfaces.cdb.cdbQueryService.CDBQueryService com.sinosoft.aml.application.impl.BlackCheckServiceImpl.cdbQueryService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cdbQueryService': FactoryBean threw exception on object creation; nested exception is java.lang.NoSuchMethodError: org/apache/ws/commons/schema/XmlSchemaCollection.read(Lorg/w3c/dom/Document;Ljava/lang/String;)Lorg/apache/ws/commons/schema/XmlSchema;

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1227)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:776)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:458)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.sinosoft.platform.core.spring.SessionFilter.doFilter(SessionFilter.java:61)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at com.sinosoft.platform.core.spring.MyCharacterEncodingFilter.doFilterInternal(MyCharacterEncodingFilter.java:27)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:928)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1025)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3761)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:976)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:88)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862)

该异常信息后面会提示Spring容器中的webService的相关代理对象找不到其Bean等信息.

解决方案

was提供了一个共享库的创建,将was和项目中lib冲突的jar放入到共享库中,这样was启动的时候和项目中使用到的冲突jar都会依赖于共享库中的jar,以下为共享库的创建

1.创建共享库,

点击“环境”->“共享库”,根据自己的实际情况选择该共享库的作用域,一般选择当前server应用的服务器就可以


点击 新建 按钮,跳转到创建共享库的界面,保证自己的作用域和之前界面选择的作用域是一致的,然后给自己创建的共享库命名,在下方的类路径中填写该jar的在服务器中的绝对路径,不能带空格(博主就在这个地方吃了亏,jar后面不小心有了空格,项目启动还是访问webservice始终找不到共享库的jar),下方的类装入一定要打上勾,不让该共享库依赖于项目应用的加载机制



点击“应用”后点击系统弹出“保存”链接,


保存之后我们就可以选择刚才对应的作用域在共享库的主界面看到我们刚才创建的共享库的名称



2.在应用中引用刚才创建的共享库

点击“应用程序”->“全部应用程序”,找到需要引用的共享库的应用,点击应用的链接进入


点击进入到应用的详细配置界面后,点击“共享库应用”



找到需要引用共享库的应用,一般来说共享库引用在应用中,一个模块的情况下,视情况而定,点击框,点击“引用共享库”


进入共享库映射引用界面后,将可用项下刚才创建的共享库名称选中点击右侧箭头移动到右边,随后点击确定按钮


点击确定后跳转到共享库的引用界面,此时刚刚选中的项目后面一列会出现引用的共享库的名称,点击选择下方的复选框,点击确定



如果此时出现了如下图的界面错误提示,请跳转到第三步,操作完成后接着返回从第二步开始操作,如果没有出现请忽略第三步



如果上一步的异常信息没有出现,则直接点击保存,将共享库的配置信息写入到was的配置文件中


接着跳转到共享库的引用界面,此时共享库的配置完成,共享库配置完成后需要重启Server,重新加载相关的jar,否则共享库的配置不会生效


3.指定web模块的虚拟主机(步骤2中不出问题可忽略该步骤)

点击“应用程序”->“全部引用程序”,选择自己需要指定虚拟主机的引用


进入明细界面后点击“虚拟主机菜单”


进入虚拟主机界面后,,点击选择下的单选框,将在右侧的下拉框中选择需要指定的虚拟主机,点击确定按钮


在界面提示中点击保存链接,将配置信息保存到本地的配置文件中



此时虚拟主机指定完毕,引用共享库重复步骤2中的操作。





以上信息为个人亲自实践,不足之处还请各位指出,以后大家一起学习,谢谢!微笑