【问题标题】:App Engine UserService calls in servlet throw thread exception - Eclipse javaservlet 中的 App Engine UserService 调用引发线程异常 - Eclipse java
【发布时间】:2017-12-10 18:11:11
【问题描述】:

我在 Eclipse 中有一个使用 GWT 的基本 Google App Engine java 项目。我按照说明在 Eclipse 中设置应用引擎 SDK 和最新的 GWT,并在 Windows 中设置环境变量路径以指向 SDK 根文件夹。

当通过单击起始页上的登录链接(如 web.xml 文件中定义)调用登录 servlet 时,调用将按预期路由到我的 HttpServlet 处理程序类。所以效果很好。在代码中,我通过工厂方法创建了 UserService,但是任何调用,例如 isUserLoggedIn() 或 createLoginURL() 都会导致异常。我希望问题很明显,但我花了几个小时试图找出导致这个问题的原因,但没有运气:(

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {

    UserService userService = UserServiceFactory.getUserService();
    if (userService.isUserLoggedIn()) {

这是调用 isUserLoggedIn() 时的控制台输出:

java.lang.IllegalStateException: Operation not allowed in a thread that is neither the original request thread nor a thread created by ThreadManager
at com.google.appengine.api.users.UserServiceImpl.getCurrentEnvironmentOrThrow(UserServiceImpl.java:152)
at com.google.appengine.api.users.UserServiceImpl.isUserLoggedIn(UserServiceImpl.java:96)

对于使用这种类型的开发环境的任何人来说,这看起来很熟悉吗?我希望这是项目或 xml 配置文件中的一个简单设置,或者我缺少的东西。几年前我已经成功地运行过类似的代码,但刚刚回到使用 GAE 的工作,所以可能一些重要的事情已经随着 servlet 或项目设置而改变。非常感谢您提供的任何帮助和提示。

【问题讨论】:

  • 您能否添加更多有关您如何启动 Web 应用程序的详细信息?您在使用Cloud Tools for Eclipse 吗?还是较旧的(最近已弃用)Google Plugin for Eclipse
  • 抱歉,我错过了您的后续问题。我为 Eclipse 安装了 Cloud Tools,尽管我承认获取应用引擎工具以及 GWT 和 Objectify 的安装/配置进度有点令人困惑。有没有办法告诉?可能有些事情不对劲。当我调试时,我选择“GWT Development Mode with Jetty”选项。

标签: java eclipse google-app-engine gwt


【解决方案1】:

要使用 App Engine API,您必须使用开发应用服务器在本地运行/调试您的应用。在 Eclipse 中,右键单击项目并选择 Run As > App EngineDebug As > App Engine。请参阅the docs 了解更多详细信息。

要启用 GWT,您需要通过右键单击项目并选择 配置 > 启用 GWT SDM 构建器来配置 GWT SDM 构建器

【讨论】:

  • 谢谢。你的建议让我更进一步。我在 Jetty 中使用 Debug As GWT 开发模式。经过多次尝试,我终于在启用 GWT SDM 构建器后加载了 App Engine 调试。是的!有很多调试选项,包括有/无 Jetty、Legacy、App Engine。这可能会让人感到困惑,因为大多数在线文档都在描述插件时没有意识到新的 Cloud Tools for Eclipse。我从未找到对 GWT SDM 构建器的参考,因此感谢您!我不明白为什么所有这些调试配置都是默认创建的。我想我可以删除旧样式的?
  • 但是我在 Windows 上的诺顿防火墙仍然遇到问题。我必须想办法让它允许所有流量通过本地和谷歌服务器。还看到启动框中列出了 2 个服务器。一个到 localhost:8080,另一个到 127.0.0.1:9876。我会做更多的配置调整和测试,然后在这里跟进。现在工作了一半,比以前好多了。
  • 我让调试器在周五工作,现在周一没有任何变化,我无法让 localhost 服务器响应。我单击 Debug->App Engine 然后当我打开 localhost:8080 时出现 HTTP 503 错误并且服务不可用。然后,当我尝试再次启动时,我不断收到端口已在使用中的错误。所以我无法弄清楚是什么原因造成的。我检查了所有项目属性和调试配置,目前卡住了。从 Google Eclipse 插件迁移到 Google Cloud Tools 并非易事,而且文档也很简单。
  • 我遇到了类似的情况。重新启动 Eclipse 修复了它 - 不幸的是,就我而言,因为我试图重现它:-(
  • 顺便说一句:如果您对文档的改进有任何建议,请file issues on the GitHub project。或者给页面一个 1 星评价:这将提示反馈。
猜你喜欢
  • 2013-04-12
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2015-03-05
  • 1970-01-01
相关资源
最近更新 更多