0

遵循文档OptionalBinder

用于绑定可选值的 API,可以选择使用默认值。OptionalBinder 履行两个角色:

  1. 它允许框架定义一个注入点,该注入点可能受用户约束,也可能不受用户约束。
  2. 它允许框架提供可由用户更改的默认值。

我正在尝试跟进上面的第一点,为此我有以下设置:

interface Reporting<R> {} // service to be bind optionally

class InternalServiceImpl implements InternalService {
    @Inject
    Reporting reporting;
    ... // use this in a method
}

public class FrameworkModule extends AbstractModule {
   protected void configure() {
     OptionalBinder.newOptionalBinder(binder(), Reporting.class);
   }
}

class UserWorkingModule如果我不提供绑定,则在用户模块( )中

bind(new TypeLiteral<Reporting<ReportingEvent>>(){}).to(ReportingImpl.class).in(Singleton.class);

应用程序无法启动以下日志:

1) No implementation for Reporting was bound.   while locating Reporting
    for field at InternalServiceImpl.reporting(InternalServiceImpl.java:21) at
FrameworkModule.configure(FrameworkModule.java:55) (via modules: UserWorkingModule -> FrameworkModule)

Reporting是否仍然必须在中提供绑定UserWorkingModule

4

2 回答 2

1
bind(new TypeLiteral<Reporting<ReportingEvent>>(){}).to(ReportingImpl.class).in(Singleton.class);

是泛型的绑定Reporting<ReportingEvent>,而

OptionalBinder.newOptionalBinder(binder(), Reporting.class);

实际上是指定原始类型,Reporting. 相反,您想使用指定 TypeLiteral argnewOptionalBinder的重载,以便在可选请求和绑定中谈论相同的事情:

OptionalBinder.newOptionalBinder(binder(), new TypeLiteral<Reporting<ReportingEvent>>(){});

没有这个,你基本上是在说“任何对报告的绑定都将满足这个要求”,甚至类似Reporting<Object>- 如果你绑定多个会发生什么?


另一方面,如果您实际上想要允许任何Reporting类型的任何绑定(这是您的错误所暗示的,那么相反的事情是错误的:您没有绑定到 raw Reporting,而是指定了通用 impl 。更改该 bind()打电话说“这实际上只适用于原始请求”:

bind(Reporting.class).to(ReportingImpl.class).in(Singleton.class);
于 2020-01-31T22:56:00.727 回答
0

使用OptionalBinder. OptionalBinder使用try时仍然需要指定默认绑定:

     OptionalBinder.newOptionalBinder(binder(), Reporting.class)
        .setDefault()
        .to(ReportingImpl.class);
于 2020-08-03T17:08:28.760 回答