【问题标题】:ClassCastException: MyFilter cannot be cast to javax.servlet.FilterClassCastException:MyFilter 无法转换为 javax.servlet.Filter
【发布时间】:2013-02-27 18:39:05
【问题描述】:

我正在将应用程序迁移到 JBoss 7,其中所有依赖项都在 "JBOSS_HOME/server/default/lib" (JBoss 4) 中。我包含了 lib "servlet.jar" (javax.servlet. *),但是,在设置了 Global Module for JBoss 7 (modules.xml、standalone.xml、jboss-deployment-structure.xml 在war文件中)之后,库由 JBoss 正常加载.

当 JBoss 7 尝试启动过滤器时,我得到以下异常:

15:09:15,222 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/RegistrarValorDolar]] (MSC service thread 1-2) Exception starting filter cripto: java.lang.ClassCastException: cenpra.com.sigtec.business.utilities.SessionFilter cannot be cast to javax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:441) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3269) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3865) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [rt.jar:1.7.0_15]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0_15]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_15]

尝试从全局模块中删除库“servlet.jar”,尝试让服务器使用内部 jar 加载它自己的类,我得到了 ClassNotFoundExceptionof javax.servlet.Filter 类。

  • 我想使用全局模块,因为我需要重用很多库。

【问题讨论】:

    标签: jboss module classloader jboss7.x libraries


    【解决方案1】:

    您的类路径被多个不同版本的javax.servlet.Filter 类污染。类加载器 X 加载的类(例如负责容器内部类的类)与类加载器 Y 加载的类(例如负责 webapp 类的类)不同。

    我包含了 lib "servlet.jar" (javax.servlet.)

    这至少听起来不对。这应该已经由目标 servletcontainer(在您的情况下是 JBoss)提供。您绝对不应该在其 /WEB-INF/lib 文件夹中提供特定于 servletcontainer 的库以及 webapp。这只会导致运行时类路径灾难,因为它们的类加载优先于 servletcontainer 本身提供的类,因此与 servletcontainer 的内部类冲突,而后者又使用 servletcontainer 自己的类。

    删除 /WEB-INF/lib 文件夹中的特定于 servletcontainer 的库。

    这是他们在 IDE 中遇到的javax.servlet API 上粗心尝试修复/规避编译错误时的常见错误。它应该以不同的方式解决。至此,您需要告诉 IDE 将 Web 项目与给定的目标容器相关联。然后 IDE 将自动执行必要的构建路径魔术。

    另见:

    【讨论】:

    • 我从来没有提到依赖项在我的网络应用程序的 /WEB-INF/lib 中。类路径没有被污染,只是特定的依赖项。我有没有提到它是使用 JBoss 的全局模块作为有问题的链接。不知道你有没有注意这个问题,但是当我从全局模块中删除 lib servlet.jar 时,我得到类过滤器的 ClassNotFoundException。 Web 应用尚未通过从容器加载的 Filter 类进行搜索。
    • 我的回答是基于你得到的异常+堆栈跟踪。例外不会说谎。您的运行时类路径肯定被多个 Servlet API 副本污染了。我只是想根据您的问题指出一个可能的原因,这似乎有些模棱两可。根据迄今为止提供的信息,我至少没有看到任何其他可能的原因。我所能说的就是扫描整个运行时类路径。 /WEB-INF/libJRE/libJRE/lib/extJBoss/lib,等等..等等..
    猜你喜欢
    • 2017-02-12
    • 2015-10-28
    • 2012-11-20
    • 2014-08-23
    • 2017-05-08
    • 1970-01-01
    • 2013-03-20
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多