example ejemplo java spring map

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í