ejemplo - modelmapper java
Spring no puede autoajinar Map bean (3)
A partir de la primavera 4.3, @Autowired
puede inyectar listas y mapas y el código dado en la pregunta funcionaría:
Dicho esto, a partir de 4.3, los tipos de colecciones / mapas y matrices se pueden emparejar a través del algoritmo de coincidencia de tipos
@Autowired
de Spring, siempre que la información del tipo de elemento se conserve en firmas de tipo de retorno@Bean
o jerarquías de herencia de recopilación.
Pero con una versión de Spring inferior, no puedes autocablear una colección como esa. Sin embargo, puedes hacer lo siguiente:
@Resource(name="AdditionalParams")
private Map<String, String> additionalParams;
o incluso:
@Value("#{AdditionalParams}")
private Map<String, String> additionalParams;
Verifique los documentos de primavera , la sección de consejos:
los beans que se definen a sí mismos como una colección o tipo de mapa no se pueden inyectar a través de @Autowired, porque la coincidencia de tipos no se aplica correctamente a ellos. Use @Resource para tales granos
Definí un mapa en primavera como tal:
<util:map id="AdditionalParams" scope="prototype" map-class="java.util.HashMap"
key-type="java.lang.String" value-type="java.lang.String">
<entry key="Start" value="12345" />
<entry key="Finish" value="12365" />
</util:map>
Y luego estoy autoarriendo este bean a una propiedad definida como:
private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams;
Al hacer esto, se lanza una excepción diciendo que:
Causado por: org.springframework.beans.factory.BeanCreationException: error al crear bean con el nombre ''DutyCreator'': la inyección de las dependencias de autocable falló; la excepción anidada es org.springframework.beans.factory.BeanCreationException: no se pudo autocablear el campo: private java.util.Map DutyCreator.additionalParams; la excepción anidada es org.springframework.beans.factory.NoSuchBeanDefinitionException: no se ha encontrado ningún bean de tipo [java.lang.String] para la dependencia [map with value type java.lang.String]: se espera al menos 1 bean que califique como candidato de autowire por esta dependencia. Anotaciones de dependencia: {@ org.springframework.beans.factory.annotation.Autowired (required = true), @ org.springframework.beans.factory.annotation.Qualifier (value = AdditionalParams)}
Causado por: org.springframework.beans.factory.NoSuchBeanDefinitionException: No se ha encontrado ningún bean de tipo [java.lang.String] para la dependencia [map with value type java.lang.String]: se esperaba al menos 1 bean que califique como candidato de autowire por esta dependencia. Anotaciones de dependencia: {@ org.springframework.beans.factory.annotation.Autowired (required = true), @ org.springframework.beans.factory.annotation.Qualifier (value = AdditionalParams)}
¿Algunas ideas?
Aclamaciones.
Parece que su @Qualifier (value = "AdditionalParams") no funciona.
Intenta usar el mapa siguiendo la anotación:
@Resource
private Properties AdditionalParams;
y manteniendo su archivo applicationContext.xml intacto.
@Autowired ApplicationContext ctx;
private <T> T getBean(String qualifier, Class<T> returnType){
//use this for loop to print all bean from ctx. so you wont miss the typo.
/*for(String s:ctx.getBeanDefinitionNames())
log.info(s);*/
return ctx.getBean(qualifier, returnType);
}
// dentro de tu llamada
if(providerList == null){
providerList = ctx.getBean("providerList", Map.class);
}
Esta solución funciona bien para mí