【问题标题】:Play WS client within a module在模块中播放 WS 客户端
【发布时间】:2020-07-27 11:58:51
【问题描述】:

我正在尝试在模块内使用带有 play 2.7.4 的 WS 客户端,但遇到了问题。我宁愿不按照here 的描述自己创建客户端,而是使用 guice 依赖注入它。这似乎不起作用,我的实例为空。如果我在模块外使用 WS 客户端,一切正常。

根据我阅读here 的内容,此时模块内只有配置和环境可用,还没有其他绑定。

有什么方法可以实现吗?


[编辑 1]

我从this answer 了解到的是创建一个像这样的提供程序类,我通常在其中注入它

public class WSClientProvider implements Provider<WSClient> {

WSClient wsClient;

@Inject
public WSClientProvider(WSClient wsClient) {
    this.wsClient = wsClient;
}

@Override
public WSClient get() {
    return wsClient;
}

}

然后在模块内部像这样绑定它

bind(WSClient.class).toProvider(WSClientProvider.class);

但这不适用于我的情况。我在这里错过了什么?


[编辑 2]

这是我目前的模块

public class SecurityModule extends AbstractModule {

private final Environment environment;
private final Config configuration;

public SecurityModule(final Environment environment, final Config configuration) {
    this.environment = environment;
    this.configuration = configuration;
}

@Override
protected void configure() {
    ...some bindings...
}

@Provides
private ObjectA provideMyObjectA() {
    return new ObjectA(); <-- we want to inject the WSClient inside this object

}

【问题讨论】:

  • 你能发布模块的完整源代码吗?
  • @TimMoore 已添加,是否更清楚?

标签: playframework guice ws-client


【解决方案1】:

我认为你可能需要更进一步

public class ObjectAProvider implement Provider<ObjectA> {
     @Inject
     WSClient wsClient;

     public ObjectA get() {
          return new ObjectA(wsClient);
     }
}

或者您必须在提供程序方法中手动注入:

ObjectA objectA = injector.getInstance(ObjectA.class);
return objectA;

一旦你创建了注入器。

【讨论】:

  • 这修复了它!我确实需要将 ObjectA 的 @Provides 转换为单独的提供程序类并在其中注入 WSClient
猜你喜欢
  • 2018-07-08
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2010-11-09
相关资源
最近更新 更多