ClassCastException:无法将MyFilter强制转换为javax.servlet.Filter

Raf*_*gio 4 jboss module classloader libraries jboss7.x

我正在将应用程序迁移到JBoss 7,其中所有依赖项都在"JBOSS_HOME/server/default/lib"(JBoss 4)中.我包含了lib "servlet.jar"(javax.servlet.*),但是,在设置了JBoss 7全局模块(modules.xml,standalone.xml,war文件中的jboss-deployment-structure.xml)后,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]
Run Code Online (Sandbox Code Playgroud)

试图删除从全球模块库"的servlet.jar",在尝试了服务器负载是通过内部的jar自己的类,我得到了ClassNotFoundExceptionjavax.servlet.Filter类.

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

Bal*_*usC 8

您的类路径受到多个不同版本化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的库.

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

也可以看看: