Home > database >  Spring String & Map Injection
Spring String & Map Injection

Time:11-16

I've a simple question.(odd scenario for me)

I've this bean below.

@Configuration
public class ConfigurationBean {

@Bean
public Config getConfig() {
    return ConfigFactory.load();
}

@Bean
public Map<String, String> tableMap(Config config) {
    return config.getObject("tables").unwrapped().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString()));
}

@Bean
public String url(Config config) {
    return config.getString("url");
}
}

And my service class;

@Component
public class TableService  {
private final Map<String, String> tableMap;
private final String url;
private Connection connection;
private final TableToJsonConverter tableToJsonConverter;

@Autowired
public TableService(TableToJsonConverter tableToJsonConverter,
                    String url,
                    Map<String, String> tableMap) {
    this.url = url;
    this.tableMap = tableMap;
    this.tableToJsonConverter = tableToJsonConverter;
}

So the scenario is, url bean returns value www.google.com. tableMap bean returns newGame:new_game_table,oldGame:old_game_table

Now what I am expecting to inject map to map, string to string in the constructor of TableService. But what really happens is, url is inserted correctly however the map is injected as url:www.google.com

TableMapContent

See here

I am a bit puzzled, could you please let me know what's happening here?

Thanks in advance.

CodePudding user response:

That is expected behavior. Spring supports taking collection types to pass in multiple beans. So List<MyPojo> will inject a list of all the MyPojo beans. What is happening in your case, is Spring is injecting the bean name / string value since that is a Map<String, String>.

You shouldn't have to name beans though, the default bean name is the method name. The qualifier is a valid workaround in this case.

  • Related