对使用 Google App Engine 部署的 java 后端执行 api 请求时出错

Errors when performing api request to java backend deployed with Google App Engine

提问人:Sara 提问时间:11/18/2023 最后编辑:Brian Tompsett - 汤莱恩Sara 更新时间:11/18/2023 访问量:22

问:

我是 Java 和部署应用程序的初学者。我目前正在开发我的第一个游戏应用程序。我的前端是用 Angular 构建的,后端是用 Java 构建的。本地测试很成功,但在部署到 Google App Engine 时,我遇到了问题。

当尝试让前端与 Google App Engine 上的后端进行通信时,会出现此问题。在对其中一个端点执行 API 请求时,我收到 504: Gateway Timeout 错误。在本地,一切正常。

我怀疑 Google App Engine 中存在配置错误,可能与包含所有端点的文件有关。此文件位于名为“api”的文件夹中。在本地,我使用一个实现并包含 .CORS 筛选器也在此文件中注册。此文件作为参数传递给 Jetty createServer 方法,如下所示:ResourceConfigpackages("dance_game.api")

package dance_game;

import java.net.URI;
import java.sql.Connection;
import java.sql.SQLException;
import org.glassfish.jersey.jetty.JettyHttpContainerFactory;
import org.glassfish.jersey.server.ResourceConfig;

import dance_game.sources.AppResourceConfig;

public class DanceGame {
    public static void main(String[] args) {
        ResourceConfig resourceConfig = new AppResourceConfig();
        String baseUri = "http://imposter-dance-game.ew.r.appspot.com/";
        JettyHttpContainerFactory.createServer(URI.create(baseUri), resourceConfig);

        try (Connection connection = DatabaseConnection.getConnection()) {
            System.out.println("Connected to database :D");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

正如我所说,这在本地有效,但现在我已经使用 GAE 部署了后端,这将不再有效。取而代之的是,我添加了这个文件来实现 ,该文件还引用了包含端点的文件并注册了 CORS 过滤器:ServletContainerInitializer

package dance_game.sources;

import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;

public class JerseyServletContainerInitializer implements ServletContainerInitializer {
    @Override
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        System.out.println("JerseyServletContainerInitializer executed");
        ResourceConfig resourceConfig = new ResourceConfig();
        resourceConfig.packages("dance_game.api");
        resourceConfig.register(CorsFilter.class);

        ServletRegistration.Dynamic registration = ctx.addServlet("JerseyServlet", new ServletContainer(resourceConfig));
        registration.setLoadOnStartup(1);
        registration.addMapping("/*");
    }
}

我在 GAE 中没有看到文件中的日志记录,所以我怀疑它没有执行。我还在resources/META-INF/services中添加了该文件,其中包括:javax.servlet.ServletContainerInitializer

dance_game.sources.JerseyServletContainerInitializer

我是否忘记了让它工作的东西?

需要时请询问更多信息,我在这个问题上坚持了很长时间,所以如果有人能提供帮助,那就太好了!

java maven google-app-engine cors

评论


答: 暂无答案