Here's the Map
@Autowired
private Map<String, ISendableConverter> converters;
and ISendableConverter
public interface ISendableConverter {
ISendableMsg convert(BaseMessage baseMessage);
String getType();
}
There are some classes that implements ISendableConverter
I want to inject them into the variable converters
by using spring @Autowried
annotation.
The instance of class as value, and the result of method getType()
as key.
like this one
@Component
public class SendableVoiceMsgConverter implements ISendableConverter {
@Override
public ISendableMsg convert(BaseMessage baseMessage) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getType() {
return "VOICE";
}
}
Is this possible? and how?
Try with something like @Resource - I have not tested this code.
@Resource(name="converters")
private Map<String, ISendableConverter> converters;
or
@Value("#{converters}")
private Map<String, ISendableConverter> converters;
From Spring Docs
(..) beans that are themselves defined as a collection or map type cannot be injected through @Autowired, because type matching is not properly applicable to them. Use @Resource for such beans, referring to the specific collection or map bean by unique name.
This should work, only if you prepare converters
bean like this:
<util:map id="converters" scope="prototype" map-class="java.util.HashMap"
key-type="java.lang.String" value-type="...ISendableConverter">
<entry key="VOICE" value="sendableVoiceMsgConverter" />
</util:map>
This is also similar question: