登录时出现NoSuchMethodError,但可以在其他PC上正常工作

时间:2018-12-17 03:24:37

标签: java spring spring-security websphere

我在WebSphere中部署了一个正常工作的Java Web应用程序。

但是从Windows自动更新后,出现了 NoSuchMethodError 。我能够直接转到应用程序的登录页面。但是每次我登录时,都会出现此错误。

这是完整的错误。

Error Message: javax.servlet.ServletException: java.lang.NoSuchMethodError: org/springframework/web/util/WebUtils.getNativeResponse(Ljavax/servlet/ServletResponse;Ljava/lang/Class;)Ljava/lang/Object;
Error Code: 500
Target Servlet: com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor
Error Stack: 
java.lang.NoSuchMethodError: org/springframework/web/util/WebUtils.getNativeResponse(Ljavax/servlet/ServletResponse;Ljava/lang/Class;)Ljava/lang/Object; 
     at org.springframework.security.web.context.HttpSessionSecurityContextRepository.saveContext(HttpSessionSecurityContextRepository.java:109) 
     at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:93) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
     at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
     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.HttpInboundLink.ready(HttpInboundLink.java:283) 
     at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) 
     at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113) 
     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) 
  

我试图将war文件部署到其他PC,并且工作正常。我什至复制了他的.ear文件夹并替换了我的.ear文件夹,但还是没有运气。

我比较了我的java版本,jar版本和websphere版本,它们都是相同的。

我没有其他解决办法。请帮忙!

谢谢!

更新

我使用同事的IP作为数据源中的主机名,而不是localhost,并且能够无任何错误地登录。另外,我不知道这是否与我的问题有关,当我尝试调试应用程序时,我得到无法连接到远程VM。连接超时。,但是当我再次使用同事的IP作为主机名时,我可以调试。笔记本电脑有问题吗?

2 个答案:

答案 0 :(得分:0)

从下面的链接,控制您的应用程序父类加载器的第一个和最后一个配置。在您的应用程序的链接中执行过程命令。当WebUtils类位于同时用于WAS内部库和您的耳朵的lib的库中时,您会在运行时遇到“没有这样的方法异常”的情况。因此,如果getNativeResponse方法不在已加载的内部WebUtils类中。您将获得此运行时异常。您可以在 WAS 库和 Ear's 库中控制WebUtils.getNativeResponse及其标志的罐子。根据这种情况,选择父级最后一个或第一个配置  类加载器。

https://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/trun_classload_server.html

答案 1 :(得分:0)

您的应用程序几乎可以肯定在其WEB-INF / lib目录中包含两个单独的不兼容的Spring jar。该目录的内容没有按照规范进行排序,并且服务器只是以从文件系统获取列表的任何顺序将它们放在WAR类路径中。最有可能的是,发生故障的系统以与操作系统不同的顺序本机返回该目录中的文件列表,并且该顺序导致jar的“错误”副本显示在类路径中的更早位置。

简单的解决方案是简单地摆脱那个错误的版本-Java不允许从单个类加载器中加载相同名称的两个类,因此实际上没有办法利用打包在其中的多个版本一场战争。无法在单个WAR模块中使用单一技术的多个不兼容版本。

如果在确定哪些jar是正确的问题上遇到了问题,可以通过启用详细的类加载(这是服务器JVM配置面板上的复选框)并搜索native_stderr.log来验证类来自何jar。这些类来自什么罐-重要的类是org.springframework.web.util.WebUtils和org.springframework.security.web.context.HttpSessionSecurityContextRepository。 Spring通常很适合在罐子上使用版本字符串,因此希望您可以很容易地从输出中看到正在使用的版本以及需要删除的版本。