提问人:Sara 提问时间:11/18/2023 最后编辑:Brian Tompsett - 汤莱恩Sara 更新时间:11/18/2023 访问量:22
对使用 Google App Engine 部署的 java 后端执行 api 请求时出错
Errors when performing api request to java backend deployed with Google App Engine
问:
我是 Java 和部署应用程序的初学者。我目前正在开发我的第一个游戏应用程序。我的前端是用 Angular 构建的,后端是用 Java 构建的。本地测试很成功,但在部署到 Google App Engine 时,我遇到了问题。
当尝试让前端与 Google App Engine 上的后端进行通信时,会出现此问题。在对其中一个端点执行 API 请求时,我收到 504: Gateway Timeout 错误。在本地,一切正常。
我怀疑 Google App Engine 中存在配置错误,可能与包含所有端点的文件有关。此文件位于名为“api”的文件夹中。在本地,我使用一个实现并包含 .CORS 筛选器也在此文件中注册。此文件作为参数传递给 Jetty createServer 方法,如下所示:ResourceConfig
packages("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
我是否忘记了让它工作的东西?
需要时请询问更多信息,我在这个问题上坚持了很长时间,所以如果有人能提供帮助,那就太好了!
答: 暂无答案
评论