什么可能导致Servlet过滤器的ClassNotFoundException而不是明显的错误配置问题?

时间:2015-05-08 22:07:05

标签: java servlets servlet-filters

除了明显的错误配置问题之外,什么可能导致Servlet过滤器的ClassNotFoundException?

我已经在我的web.xml文件中定义了servlet过滤器:

<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>com.foo.security.SecurityFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

而且,我已经在我的班级中定义了servlet过滤器:

package com.foo.security;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;


public class SecurityFilter implements Filter{
    private static final int MAX_LENGTH = 4096;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Initializing SecurityFilter!!!");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try{
            System.out.println("Calling SecurityFilter.doFilter()!!!");
            chain.doFilter(request, response);
        }catch(Exception e){

        }finally{

        }
    }

    @Override
    public void destroy() {
        System.out.println("Destroying SecurityFilter!!!");
    }

}

我确保它包含在JAR文件中,并且JAR文件包含在WEB-INF / lib目录中,并且该类也包含在WEB-INF / classes目录中。

但是,我一直得到这个例外:

2015-05-06 13:01:42.926 ERROR   [ScannerThread] org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/testApp] - Exception starting filter SecurityFilter

        java.lang.ClassNotFoundException: com.foo.security.SecurityFilter
            at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
            at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:249)
            at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
            at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
            at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3722)
            at org.apache.catalina.core.StandardContext.start(StandardContext.java:4367)
            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:790)
            at org.apache.catalina.core.ContainerBase.access$000(ContainerBase.java:122)
            at org.apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.java:144)
            at java.security.AccessController.doPrivileged(Native Method)
            at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:768)
            at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:553)
            at sun.reflect.GeneratedMethodAccessor512.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

以下是JAR文件的内容:

META-INF/
META-INF/MANIFEST.MF
com/
com/foo/
com/foo/security/
com/foo/security/SecurityFilter.class

以下是WAR文件的内容:

META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/com/
WEB-INF/classes/com/foo/
WEB-INF/classes/com/foo/security/
WEB-INF/lib/
WEB-INF/classes/com/foo/security/SecurityFilter.class
WEB-INF/jboss-web.xml
WEB-INF/lib/com.foo.security.jar
WEB-INF/web.xml

1 个答案:

答案 0 :(得分:0)

这是问题所在:过滤器类是应用程序启动时首先加载的外部依赖项之一。因此,有很多种可能的原因会表现为“找不到过滤器类”,而实际上只是找不到常规类。

以下是要检查的几件事(希望其他人可以随时间添加到此列表中):