【问题标题】:Tomcat 8.5, Netbeans 11.2 Exception starting filter [duplicate]Tomcat 8.5,Netbeans 11.2 异常启动过滤器 [重复]
【发布时间】:2020-02-27 16:31:06
【问题描述】:

当我使用 Java 8、Tomcat 8、Netbeans 8 运行 Web 应用程序时,它运行得非常好。使用 Netbeans 11 运行相同的应用程序,即使在 Netbeans 11 中仍然是 Java 8、Tomcat 8,也会出现以下错误。

这是 tomcat 错误日志。

Mar 05, 2020 9:30:40 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter DatabaseCheckFilter
java.lang.RuntimeException: 
    at filters.DatabaseCheckFilter.<init>(DatabaseCheckFilter.java:1)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:424)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4072)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4726)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
    at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
    at org.apache.catalina.core.StandardService.start(StandardService.java:525)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

类的代码是

package filters;

import dataaccesslayer.DatabaseCheck;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import utilities.exceptions.ExceptionLogger;

public class DatabaseCheckFilter implements Filter {

    // The filter configuration object we are associated with.  If
    // this value is null, this filter instance is not currently
    // configured.
    private FilterConfig filterConfig = null;

    public DatabaseCheckFilter() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        boolean databaseError = false;
        try {
            DatabaseCheck check = new DatabaseCheck();
            databaseError = check.Check(response);
            if (databaseError == true) {
                RequestDispatcher fd=request.getRequestDispatcher("/error/unavailable.jsp");
                fd.forward(request,response);
            }
            else {
                chain.doFilter(request, response);
            }
        } catch (Exception exception) {
            ExceptionLogger.logException(exception);
        }
    }

    public FilterConfig getFilterConfig() {
        return (this.filterConfig);
    }

    public void setFilterConfig(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    public void destroy() {        
    }

    public void init(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }
}

web.xml 的摘录是

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
        <filter-name>UserInfoFilter</filter-name>
        <filter-class>filters.UserInfoFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>UserInfoFilter</filter-name>
        <url-pattern>/scheduler.jsp</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>DatabaseCheckFilter</filter-name>
        <filter-class>filters.DatabaseCheckFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>DatabaseCheckFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>

【问题讨论】:

  • 您确定 stacktrace 不会以“Caused by:”继续,显示它失败的真正原因? --- 另外,你能显示DatabaseCheckFilter的代码吗?
  • 如果没有DatabaseCheckFilter 类的来源,很难说什么,它看起来是你的一个,而不是一个内置的Java 类或一个来自常用库的类。我能想到的最好的猜测是这个类有一个类似于下面的catch块:catch (Exception e) { throw new RuntimeException(e.getMessage()); },而这个catch块正在捕捉一个通常没有消息的NullPointerException。
  • 我添加了完整的堆栈跟踪以及类和 web.xml 文件中的代码
  • 请确保您没有将一些非常旧的 servlet-api.jar 与您的 .war 文件一起发送。更好的是:要么使用你最新的 tomcat 发行版中的 servlet-api.jar 来编译你的 web 应用程序,要么使用一些相对现代的版本。
  • 我正在使用 Tomcat 8 中包含的 servlet-api.jar 文件

标签: java tomcat netbeans


【解决方案1】:

Netbeans 11+ 版本解决了这个问题。

【讨论】:

    【解决方案2】:

    运行刚刚发布的 Netbeans 11.3 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 2015-12-17
      • 2012-02-10
      • 2013-07-08
      • 1970-01-01
      • 2013-04-29
      • 2016-02-17
      • 2015-09-03
      • 1970-01-01
      相关资源
      最近更新 更多