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
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions