What did I do wrong? How do I resolve the issue?
Here :
Map<String,String> someMap = (Map<String,String>)getApplicationContext().getBean("someMap");
You use a legacy method that we generally don't want to use since that returns Object
:
Object getBean(String name) throws BeansException;
The method to favor to get (for singleton) / create (for prototype) a bean from a bean factory is :
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Using it such as :
Map<String,String> someMap = app.getBean(Map.class,"someMap");
will compile but still with a unchecked conversion warning since all Map
objects are not necessarily Map<String, String>
objects.
But <T> T getBean(String name, Class<T> requiredType) throws BeansException;
is not enough in bean generic classes such as generic collections since that requires to specify more than one class as parameter : the collection type and its generic type(s).
In this kind of scenario and in general, a better approach is not to use directly BeanFactory
methods but let the framework to inject the bean.
The bean declaration :
@Configuration
public class MyConfiguration{
@Bean
public Map<String, String> someMap() {
Map<String, String> someMap = new HashMap();
someMap.put("some_key", "some value");
someMap.put("some_key_2", "some value");
return someMap;
}
}
The bean injection :
@Autowired
@Qualifier("someMap")
Map<String, String> someMap;