java - 使用 servlet 过滤器时 App Engine 上的 Spring Boot 应用程序出现错误

标签 java spring-boot google-app-engine filter

我正在使用 Spring Boot + 应用程序引擎构建一个简单的 Web 应用程序。 我已遵循 getting started github page 中建议的指南一切都工作正常,直到我尝试实现一个简单的过滤器:

public class AuthFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        log.info("TESST");
    }
}

以普通 servlet 方式配置 web.xml 页面:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <filter>
        <filter-name>AuthFilter</filter-name>
        <filter-class>eu.project.docscatalog.filters.AuthFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AuthFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

(我也尝试过使用 @Component 注释,就像您通常在 Spring 应用程序中所做的那样)

当我使用 mvn appengine:run 启动应用程序时,Web 服务器启动,但出现以下错误消息:

[INFO] GCLOUD: 2019-06-03 10:28:07.956:WARN:oejw.WebAppContext:main: Failed startup of context c.g.a.t.d.j.DevAppEngineWebAppContext@a85644c{/,file:///C:/Users/Pierluigi/Desktop/source/docs-catalog/target/docs-catalog-1-0-0/,UNA
VAILABLE}{C:\Users\Pierluigi\Desktop\source\docs-catalog\target\docs-catalog-1-0-0}
[INFO] GCLOUD: java.lang.AbstractMethodError
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:136)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:750)
[INFO] GCLOUD:  at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
[INFO] GCLOUD:  at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:742)
[INFO] GCLOUD:  at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:742)
[INFO] GCLOUD:  at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:744)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:368)
[INFO] GCLOUD:  at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1497)
[INFO] GCLOUD:  at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1459)
[INFO] GCLOUD:  at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:852)
[INFO] GCLOUD:  at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:278)
[INFO] GCLOUD:  at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545)
[INFO] GCLOUD:  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
[INFO] GCLOUD:  at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138)
[INFO] GCLOUD:  at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108)
[INFO] GCLOUD:  at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)
[INFO] GCLOUD:  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
[INFO] GCLOUD:  at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138)
[INFO] GCLOUD:  at org.eclipse.jetty.server.Server.start(Server.java:415)
[INFO] GCLOUD:  at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108)
[INFO] GCLOUD:  at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)
[INFO] GCLOUD:  at org.eclipse.jetty.server.Server.doStart(Server.java:382)
[INFO] GCLOUD:  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
[INFO] GCLOUD:  at com.google.appengine.tools.development.jetty9.JettyContainerService.startContainer(JettyContainerService.java:343)
[INFO] GCLOUD:  at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:283)
[INFO] GCLOUD:  at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
[INFO] GCLOUD:  at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java:87)
[INFO] GCLOUD:  at com.google.appengine.tools.development.Modules.startup(Modules.java:105)
[INFO] GCLOUD:  at com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:282)
[INFO] GCLOUD:  at com.google.appengine.tools.development.DevAppServerImpl.access$000(DevAppServerImpl.java:47)
[INFO] GCLOUD:  at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:223)
[INFO] GCLOUD:  at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:221)
[INFO] GCLOUD:  at java.security.AccessController.doPrivileged(Native Method)
[INFO] GCLOUD:  at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:221)
[INFO] GCLOUD:  at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:404)
[INFO] GCLOUD:  at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:45)
[INFO] GCLOUD:  at com.google.appengine.tools.development.DevAppServerMain.run(DevAppServerMain.java:257)
[INFO] GCLOUD:  at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:248)

过滤器不起作用,我认为这可能与提供的 tomcat 有关,并且是由一些重复的依赖项引起的,但是我找不到导致问题的原因。我的 pom 包含以下依赖项:

 <dependencies>
        <!--Spring boot components-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-gcp-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-gcp-starter-data-datastore</artifactId>
        </dependency>

        <!--Standard dep-->

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-1.0-sdk</artifactId>
            <version>${appengine.target.version}</version>
        </dependency>

        <!--Provided-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <scope>provided</scope>
        </dependency>

        <!--Test related-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

有人知道发生了什么事吗? 我真的很感谢任何伸出援手的人:)

最佳答案

我明白了。

我没有遵循getting started page正确。

我必须从 spring-boot-starter-web 中排除 spring-boot-starter-tomcat 并包含 servlet-api。

感谢@Saheb 为我指明了正确的方向:)

关于java - 使用 servlet 过滤器时 App Engine 上的 Spring Boot 应用程序出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56423915/

相关文章:

java - 如何在插入时使用typeHandler在mybatis中映射枚举类型

java - Jsoup空指针异常

node.js - 将 MeteorJs 应用程序部署到 Google App Engine

python - 在 Appengine 上使用 web.py

java - Spring Boot 为 POST 到未知 URL 返回 405 而不是 404

javascript - GAE 上的 NextJS - 错误 : EROFS: read-only file system

java - 用户使用其私钥对数据进行签名/时间戳记的最佳方式是什么?

java - ServletActionContext.getRequest().removeAttribute() 不起作用

java - 如何从另一个 Maven 模块启动 Spring Boot 应用程序?

java - 在 Spring Boot 应用程序中维护多个属性文件