【问题标题】:Maven cannot be cast to javax.servlet.FilterMaven 无法转换为 javax.servlet.Filter
【发布时间】:2017-02-12 10:57:11
【问题描述】:

我开始使用 maven 开发一个项目,但是当我启动它时,它说我的过滤器无法转换为 javax.servle.Filter。

这是个例外:

    GRAVE: Exception starting filter FilterLogin
java.lang.ClassCastException: it.tgi.cd.servlet.FilterLogin cannot be cast to javax.servlet.Filter
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4775)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5452)
    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.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

这是我的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>it.project</groupId>
    <artifactId>Projet</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>


    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.2.Final</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0-b01</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-catalina</artifactId>
            <version>8.0.32</version>
        </dependency>


    </dependencies>

    <build>
        <finalName>SimpleProject</finalName>
        <plugins>

            <!-- Config: Maven Tomcat Plugin -->
            <!-- http://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <!-- Config: contextPath and Port (Default - /SimpleProject : 8080) -->
                <!--
                <configuration>
                    <path>/</path>
                    <port>8899</port>
                </configuration>
                -->
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

为什么我会收到此错误?

过滤登录

   package it.tgi.cd.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebFilter(urlPatterns = {"/index.jsp", "/insert.jsp", "/search.jsp", "/addSongs.jsp", "/delete.jsp"}, filterName = "FilterLogin")
public class FilterLogin implements javax.servlet.Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        if(request.getSession().getAttribute("user") != null) {
            chain.doFilter(req, resp);
        } else {
            response.sendRedirect("/login.jsp");
        }
    }

    public void init(FilterConfig config) throws ServletException {
    }

}

我按照建议使用了“provide”,异常消失了,但现在当我尝试转到“localhost ecc..”时出现异常

   INFORMAZIONI: Starting ProtocolHandler ["http-bio-8080"]
ott 04, 2016 3:06:42 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [jsp] in context with path [/CDStore] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at org.apache.jsp.login_jsp._jspInit(login_jsp.java:31)
    at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:49)
    at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:180)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

不知道是不是正常,但是一直卡在“INFORMAZIONI: Starting ProtocolHandler ["http-bio-8080"]”上

然后我转到本地主机,异常消失了。

在 WEB-INF/lib 下我没有任何 jar 文件。 这是我的构建路径

【问题讨论】:

  • it.tgi.cd.servlet.FilterLogin 类是什么?
  • 能否添加过滤代码
  • @Berger 添加到主帖中
  • Apache Tomcat 7.x 实现了 Servlet 3.0

标签: java maven tomcat servlets


【解决方案1】:

1) 在 pom.xml 中添加 servlet 依赖如下:

<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>3.0.1</version>
   <scope>provided</scope>
</dependency>

2) 确保您的类路径中没有填充多个不同版本的 javax.servlet.Filter 类。
检查servlet-api.jar 是否存在于/WEB-INF/lib文件夹中。您必须在 pom.xmlbuild-path 中添加依赖项。

【讨论】:

  • 我使用了“provided”并且转换异常消失了,我将 servlet-api.jar 放入 web-inf/lib,然后放入“Dipendencies”(我使用 intellij),现在它给了我“GRAVE” :servlet [jsp] 的 Servlet.service() 在路径 [/CDStore] 的上下文中抛出异常 [java.lang.NullPointerException],根本原因 java.lang.NullPointerException 在 org.apache.jsp.login_jsp._jspInit(login_jsp.java :31)"
  • 这个异常不同,将整个堆栈跟踪放在问题中。请记住,在 lib 文件夹或 pom.xml 中应该只有一个 servlet-api jar
  • 更新问题
  • 当您尝试访问未初始化的变量时会发生 nullPointerException。我认为它发生在`response.sendRedirect("/login.jsp");`或if(request.getSession().getAttribute("user") != null)检查第31行代码
  • 这是 login.java 的第 31 行 el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
【解决方案2】:

您正在将javax.servlet-api jar 文件与您的应用程序一起打包。您应该使用 Tomcat 中可用的 jar 文件来避免 ClassCastException。

您可以将 maven 依赖项的范围更改为提供,以便在您的应用程序中不包含 jar 文件:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0-b01</version>
    <scope>provided</scope>
</dependency>

【讨论】:

    【解决方案3】:

    您的答案是正确的,但主要问题是我试图使用 tomcat7-plugin 启动 Web 应用程序,即使我有另一个版本。 所以我对maven的坏了解是说我必须使用tomcat的插件(pom.xml中的tomcat7-plugin)运行Web应用程序,因为我认为它应该这样做。

    该项目现在可以完美地从 tomcat 运行配置启动它。我给你竖起大拇指

    【讨论】:

      【解决方案4】:

      向您在应用程序中添加的最后一个库添加排除

      <dependency>
              <groupId>com.netflix.eureka</groupId>
              <artifactId>eureka-client</artifactId>
              <version>1.8.0</version>
              <scope>runtime</scope>
              <exclusions>
                  <exclusion>
                      <groupId>javax.servlet</groupId>
                      <artifactId>servlet-api</artifactId>
                  </exclusion>
              </exclusions>
          </dependency>
      

      【讨论】:

        猜你喜欢
        • 2015-10-28
        • 1970-01-01
        • 2012-11-20
        • 2014-08-23
        • 2017-05-08
        • 1970-01-01
        • 2013-03-20
        • 2022-12-14
        • 1970-01-01
        相关资源
        最近更新 更多