【问题标题】:Appengine with Google Cloud Endpoints and GuiceAppengine 与 Google Cloud Endpoints 和 Guice
【发布时间】:2013-06-15 23:02:11
【问题描述】:

所以我想在带有 Cloud Endpoints 的 Appengine 中使用 Guice 来注入我的服务或 daos - 我猜这很常见,但我没有找到这方面的教程。

Appengine 文档的官方指南似乎在这里:https://github.com/google/guice/wiki/GoogleAppEngine

在配置 Guice 时,您设置 com.google.inject.servlet.GuiceFilter 来拦截每个请求“/*”。在某些时候,您必须初始化模块。就像文档说的那样,一个很好的地方是 ServletContextListener。

一种特殊的模块是 ServletModules,它将请求路径映射到 Servlet 类,而不是在 web.xml 中执行此操作,您现在可以通过编程方式执行此操作。

到这里为止非常直截了当。但是如何将 Guice 配置为也包含 Endpoint-Classes?

【问题讨论】:

    标签: google-app-engine dependency-injection guice google-cloud-endpoints


    【解决方案1】:

    原来有一个 GuiceSystemServiceServletModule 可以处理这个问题。

    public class GuiceSSSModule extends GuiceSystemServiceServletModule {
    
      @Override
      protected void configureServlets() {
        super.configureServlets();
    
        Set<Class<?>> serviceClasses = new HashSet<Class<?>>();
        serviceClasses.add(MyEndpoint.class);
        serviceClasses.add(AnotherAndpoint.class);
        this.serveGuiceSystemServiceServlet("/_ah/spi/*", serviceClasses);
      }
    }
    

    在 ServletContextListener 的 Injector 构造中包含这个模块:

    public class MyGSCL extends GuiceServletContextListener {
    
      @Override
      protected Injector getInjector() {
        return Guice.createInjector(new GuiceSSSModule(), new BaseModule());
      }
    }
    

    并在您的 web.xml 中使用此侦听器:

    <listener>
       <listener-class>de.mypkg.MyGSCL</listener-class>
    </listener>
    

    还要确保在您的 web.xml 中包含 Guice 过滤器:

    <!-- GUICE -->
    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    您的端点将再次在 /_ah/api/... 下可用,您可以在端点类中使用 @Inject。

    【讨论】:

    • 这与我们在应用引擎后端使用的方式相同。从昨天开始,我无法再使用应用引擎版本 1.9.17 更新后端,所以我升级到了 1.9.38。现在它上传但我总是收到此错误:未捕获的异常来自 servlet java.lang.NoClassDefFoundError: nl/<..>/<..>/guice/GuiceSSSModule
    • @Roel 我在使用应用引擎版本 1.9.37 时遇到了类似的问题,但在阅读了您的评论后,我升级到 1.9.46,然后问题就消失了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2014-04-23
    • 1970-01-01
    • 2014-09-12
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多