【问题标题】:Servlet web.xml filter -- Class not found exceptionServlet web.xml 过滤器——找不到类异常
【发布时间】:2012-07-24 10:25:48
【问题描述】:

我在设置过滤器时遇到问题 - 我在 web.xml 中定义的过滤器看起来像这样

  <filter>
   <filter-name>Log</filter-name>
   <filter-class>test.log</filter-class> 
 </filter>
 <filter-mapping>
   <filter-name>Log</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>

但我收到以下错误 -

SEVERE: Exception starting filter Log
java.lang.ClassNotFoundException: test.log
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:133)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:256)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:103)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

我已经定义了类,但由于某种原因,我得到了 Classnotfoundexcetion。有人可以帮帮我吗?

编辑——

我有一个名为 test 的包和一个名为 log 的类。

             package test;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;

    // Implements Filter class
     public class log implements Filter  {
         public void  init(FilterConfig config) {

          }
         public void  doFilter(ServletRequest request, 
             ServletResponse response,
             FilterChain chain) 
             throws java.io.IOException, ServletException {

  // Get the IP address of client machine.   
  String ipAddress = request.getRemoteAddr();

  // Log the IP address and current timestamp.
  System.out.println("IP "+ ipAddress + ", Time "
                                   + new Date().toString());

  // Pass request back down the filter chain
  chain.doFilter(request,response);
  }
   public void destroy( ){
      /* Called before the Filter instance is removed 
      from service by the web container*/
  }
 }

谢谢,

【问题讨论】:

  • 你在一个名为test的包中有一个类log吗?
  • 部署了吗?是否正确包装? FWIW,您可能应该遵循 Java 命名约定,其中状态类名称应以大写字母开头。
  • 类在你的war/WEB-INF/lib中吗?
  • 也可以在WEB-INF/classes/test
  • 我的 Java 资源中有这个类..

标签: java web-services jsp servlets web.xml


【解决方案1】:

filter-class 参数需要是一个应该实现 Filter 接口的 Java 类。你能检查一下你是不是这样?

查看此示例以获得指导:

http://viralpatel.net/blogs/tutorial-java-servlet-filter-example-using-eclipse-apache-tomcat/

从上面的链接:

<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>
        net.viralpatel.servlet.filters.LogFilter
    </filter-class>
    <init-param>
        <param-name>test-param</param-name>
        <param-value>This parameter is for testing.</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>LogFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>



public class LogFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {...
    }
 }

【讨论】:

    【解决方案2】:

    我猜你没有将它正确复制到 servlet 类路径中。

    请参阅此处了解组成 servlet 类路径的内容:

    Controlling the classpath in a servlet

    【讨论】:

    • 我必须在类路径中复制什么?
    • 在 servlet 范围内执行代码时,它需要位于几个特定位置之一。这取决于 servlet 容器以及如何打包类,但解决此问题的最简单方法是获取 .class 并将其放入 /WEB-INF/classes/test
    【解决方案3】:

    对于一个简单的解决方案,请尝试将您的 log.class 文件放入此目录:

    tomcat/webapps/[your app name]/WEB-INF/classes/test 
    

    如果该目录不存在,则创建该目录。


    如何找到您的 .class 文件:

    大多数情况下,Eclipse 的默认设置会在您保存源文件 (.java) 时将其编译为 .class 文件,否则您可能必须按 CTRL-B(构建)将其强制编译为.class 文件。

    完成后,您将能够在 Eclipse 工作区中找到 log.class 文件:[your workspace name]/[your eclipse project name]/bin/test/

    工作区目录位置通常在您启动 Eclipse 时可见。对于 Windows 7,我认为它默认为 Users 目录,WinXP 和 2000 它默认为用户的 Documents and Settings 文件夹。

    交替:

    您的 Eclipse 窗口左侧应该有一个“Package Explorer”视图。它将在包树中包含一个log.java 叶。如果您右键单击该叶子,然后单击 Show In > Navigator,这将在“导航器”视图中打开实际的文件结构。

    在该视图中应该有一个可见的bin 节点。在里面你应该找到一个test 节点,然后在里面你会看到log.class。您可以右键单击它进行复制,然后只需导航到我在顶部提供的目录并将其粘贴。

    一切都会好起来的。

    【讨论】:

    • 您好,这可能是个愚蠢的问题,但是当我在 Eclipse 上运行项目时,如何对 .class 文件进行分级?
    • @Fox 添加了有关定位 .class 文件的更多数据。
    【解决方案4】:

    很有趣,昨天还在处理这个问题时,我今天也遇到了同样的问题。经过调查显示没有任何问题,我得出结论这是一个 Eclipse 环境问题:

    • 停止 tomcat 服务器
    • 清理项目(项目->清理...)
    • 刷新整个项目(右键项目名称->刷新)
    • 重新启动服务器。

    问题消失了!

    【讨论】:

    • 遇到了同样的问题,但我故意清理了我的项目。感谢您的回答,因为我不知道需要多长时间才能找到“刷新”选项;)
    【解决方案5】:

    这可能是相关类的源代码有问题。

    最近我碰巧看到了同样的问题。 经过真正长时间的苦苦调查,我发现异常是在类中编码的:

    $ jad BaseController.class 
    Parsing BaseController.class...The class file version is 51.0 (only 45.3, 46.0 and 47.0 are supported)
     Generating BaseController.jad
    $ cat BaseController.jad 
    // Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
    // Jad home page: http://www.geocities.com/kpdus/jad.html
    ...
    import HttpServletRequest;
    import HttpServletResponse;
    import HttpSession;
    ...
    public class BaseController
    {
        public BaseController()
        {
            throw new Error("Unresolved compilation problems: \n\tThe import javax.servlet.http.HttpServletRequest cannot be resolved\n\tThe import javax.servlet.http.HttpServletResponse cannot be resolved\n\tThe import javax.servlet.http.HttpSession cannot be resolved\n\tHttpSession cannot be resolved to a type\n\tHttpServletRequest cannot be resolved to a type\n\tHttpSession cannot be resolved to a type\n\tHttpSession cannot be resolved to a type\n\tHttpServletRequest cannot be resolved to a type\n\tHttpServletRequest cannot be resolved to a type\n\tHttpServletResponse cannot be resolved to a type\n");
        }
    ...
    

    所以,用必要的库重新编译源代码后,问题就解决了。

    【讨论】:

      【解决方案6】:

      曾经有问题,最后右键项目-> 构建项目帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-03
        • 2013-04-09
        • 2012-10-12
        • 2011-07-24
        • 2014-10-27
        • 2023-03-23
        • 2013-09-07
        • 1970-01-01
        相关资源
        最近更新 更多