Skip to content

Multibindings fails with jakarta.inject.Provider #4572

@natros

Description

@natros

In the release notes of dagger 2.55 it seems that there is some support for jakarta.inject.Provider but I do not know if this is supposed to work:

import dagger.Component;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.inject.Singleton;
import java.util.Map;

public class Foo {
  @Inject
  Foo(Server server) {}

  public static void main(String[] args) {}

  @Singleton
  @Component(modules = MyModule.class)
  interface MyComponent {
    Foo foo();
  }

  @Module
  interface MyModule {
    @Provides
    @IntoMap
    @StringKey("/logout")
    static Filter logoutFilter() {
      return new LogoutFilter();
    }

    @Provides
    @Singleton
    static Server server(Map<String, Provider<Filter>> filters) {
      return new Server();
    }
  }

  interface Filter {}

  static class LogoutFilter implements Filter {}

  static class Server {}
}

it fails with the following error

DaggerFoo_MyComponent.java:60: error: incompatible types: MapFactory<String,Filter> cannot be converted to dagger.internal.Provider<Map<String,jakarta.inject.Provider<Filter>>>
      this.mapOfStringAndProviderOfFilterProvider = MapFactory.<String, Foo.Filter>builder(1).put("/logout", Foo_MyModule_LogoutFilterFactory.create()).build();

The example works with javax.inject.Provider but not with jakarta.inject.Provider. Replacing the provider code with @Binds compiles:

@Binds
    @IntoMap
    @StringKey("/logout")
    Filter logoutFilter(LogoutFilter filter);

I'm testing with dagger 2.55

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions