在Google Cloud Endpoints上的自定义身份验证器中使用Guice Injection

时间:2015-09-29 09:25:59

标签: dependency-injection oauth-2.0 guice facebook-login google-cloud-endpoints

我想使用自定义的com.google.api.server.spi.config.Authenticator来保护Google云端点。 看这篇文章(here)。 例如,通过facebook oauth进行身份验证。 Authenticator必须有一个没有任何参数的默认构造函数,否则Authenticator不起作用。所以构造函数注入不可能像这样:

@Inject
public apiMethod(Log logger, Datastore datastore, MemCacheManager cacheManager) {
        this.logger = logger;
        this.datastore = datastore;
        this.cacheManager = cacheManager;
}

我想在Authenticator中缓存一些数据。所以我需要一个memcachemanager实例和日志记录器。有没有人知道如何在没有构造函数注入的情况下完成注入?

谢谢! Smilingm

1 个答案:

答案 0 :(得分:1)

我不了解Google Cloud Endpoints,但我确实知道Guice。我怀疑你不会得到你想要的答案,所以我会快速总结一下我所知道的。

最终,调用Authenticator的代码需要自己注入或者可以访问注入器,并知道在实例化之后调用Injector.injectMembers(yourAuthenticator)(可能是使用no-arg构造函数)您需要提供)或通过从Authenticator注入或请求Injector来构建您的Authenticator

鉴于您的@ApiMethod需要具有特定的构造函数签名,调用者似乎很可能不在此处使用注入,但this page暗示使用@Inject private Log logger; @Inject private Datastore datastore; @Inject private MemCacheManager cacheManager; 注释的方法可以注入了命名参数,所以它可能会起作用。您可以通过尝试现场注入来快速测试:

Injector

如果这不起作用,那么是时候发牢骚了。如果Google支持他们自己的DI框架,那就太好了。 DI仅在完整堆栈支持时才起作用。如果您的入口点不使用注入,那么您将被迫采取其他措施,例如将Authenticator置于全局单例({3}}中,或自行构建依赖项。有时这种痛苦是不可避免的。

编辑:确实听起来在Authenticator实例化后没有发生Guice注入,你的tell application "Reminders" if exists (reminders whose name is Erinnerung) then else set newremin to make new reminder set name of newremin to Erinnerung end if end tell 只能选择从静态范围获取其依赖项或直接构建它们。你将无法使用Guice。