`

spring map使用annotation泛型注入问题分析

 
阅读更多

 

  今天在整一个spring的ioc学习demo,碰到一个问题,居然@Autowire在set方法注入map时,map的key类型不能为String之外的其他类型,具体看下面问题

  

  

	@Autowired
	public void setTypeMap(Map<Integer,String> typeMap) {
		this.typeMap = typeMap;
	}

 

  xml注入配置,即时在map上加上key和value的类型也不行。

  

      <property name="typeMap">
         <map key-type="java.lang.Integer" value-type="String">
            <entry key="1">
               <value>COO)</value>
            </entry>
            <entry key="2">
               <value>CFO</value>
            </entry>
            <entry key="3">
               <value>CEO</value>
            </entry>
         </map>
      </property>

 

  报错:

   

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springweb.service.impl.HelloServiceImpl.setTypeMap(java.util.Map); nested exception is org.springframework.beans.FatalBeanException: Key type [class java.lang.Integer] of map [java.util.Map] must be assignable to [java.lang.String]
   at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:589)
   at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
   at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282)
   ... 13 more
Caused by: org.springframework.beans.FatalBeanException: Key type [class java.lang.Integer] of map [java.util.Map] must be assignable to [java.lang.String]
   at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:761)
   at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
   at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:547)

 

查看spring的代码

   

   else if (Map.class.isAssignableFrom(type) && type.isInterface()) {
         Class keyType = descriptor.getMapKeyType();
         if (keyType == null || !String.class.isAssignableFrom(keyType)) {
            if (descriptor.isRequired()) {
               throw new FatalBeanException("Key type [" + keyType + "] of map [" + type.getName() +
                     "] must be assignable to [java.lang.String]");
            }
            return null;
         }

 

 

  也就是spring使用Autowired进入注入时,map的key类型只能为string,但是

   如果我使用set方法注入后者构造方法注入,map的可以是可以自动转为integer的。

 

   set方法注入,不要在set方法上使用antowired

   

	public void setTypeMap(Map<Integer,String> typeMap) {
		this.typeMap = typeMap;
	}

 

	//构造方法注入
	public HelloServiceImpl(String greetting,Map<Integer,String> typeMap){
		this.greetting = greetting;
		this.typeMap = typeMap;
		System.out.println("call HelloServiceImpl constructor" + this.greetting);
	}

  

<constructor-arg type="Map" index="1">
			<map>
				<entry key="1">
					<value>COO</value>
				</entry>
				<entry key="2">
					<value>CFO</value>
				</entry>
				<entry key="3">
					<value>CEO</value>
				</entry>
			</map>
		</constructor-arg>

 

   可以参考http://forum.springsource.org/showthread.php?105558-Autowired-injection-of-a-Map

  • 大小: 133.4 KB
3
1
分享到:
评论
1 楼 幽默者 2015-04-02  
使用@Resource就OK。
@Resource(name = "userMap")
private Map<Long, User> userMap;

相关推荐

    Spring/泛型Hibernate的实现

    ### 泛型Hibernate的...本文详细介绍了如何实现泛型Hibernate,并将其与Spring框架集成,以及如何使用Maven构建工程。通过这些技术的应用,开发者可以更加高效地进行数据库操作,同时保证代码的可维护性和可扩展性。

    Spring 2.55 参考手册英文PDF版(免资源分)

    《Spring 2.5.5 参考手册》是一份详尽的指南,旨在帮助开发者理解和使用Spring框架的2.5.5版本。Spring是一个开源的Java平台,它为构建企业级应用程序提供了全面的支持,包括依赖注入(Dependency Injection,DI)、...

    spring2.5-英文文档1

    Spring 2.5引入了对Java注解的广泛支持,开发者可以使用注解来声明Bean及其依赖,减少了对XML配置的依赖。例如,`@Autowired`用于自动装配依赖,`@Component`、`@Service`、`@Repository`和`@Controller`用于定义...

    Java各种必备面试题目程序代码例子与应战技巧.zip

    理解List、Set、Map接口和泛型的概念也是重要的考察点。 4. **多线程**:线程的创建(Thread类和Runnable接口)、同步机制(synchronized关键字、Lock接口)、并发工具类(如Semaphore、CyclicBarrier、...

    Java_Technology_Concept_Map

    14. **Spring框架**:Spring是Java开发中最流行的框架之一,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,极大地简化了企业级应用的开发。 15. **Java 8及更高版本的新特性**:如Lambda...

    java编程思想thinking in java

    11. **注解(Annotation)**:注解是元数据的一种形式,可以用于提供编译器和JVM有关代码的额外信息,例如,Spring框架广泛使用注解进行依赖注入。 12. **垃圾回收(Garbage Collection)**:Java的自动内存管理...

    90个高质量的java问答_java_源码

    13. **Spring框架**:讲解Spring的核心功能,如依赖注入、AOP(面向切面编程)、事务管理,以及Spring Boot和Spring Cloud的相关知识。 14. **网络编程**:涉及Socket通信,TCP/IP协议,HTTP协议,以及网络编程中的...

    JAVA面试基础题

    10. **泛型**:理解泛型的基本概念,如何使用泛型类、泛型方法,以及泛型通配符和边界。 11. **注解(Annotation)**:学习自定义注解和元注解,了解它们在编译、运行时的处理方式以及在Spring框架中的应用。 12. ...

    java面试笔试试题大汇总

    11. **泛型**:理解泛型的概念,了解类型擦除,掌握泛型类、泛型接口、泛型方法的使用。 12. **注解(Annotation)**:了解注解的作用,如何自定义注解,以及元注解的使用。 13. **Spring框架**:熟悉Spring的核心...

    J2EE学习路线及重要知识点.pdf

    1. **J2SE基础**:这部分是J2EE的基础,包括面向对象编程(封装、继承、多态),内存分析,递归,集合类(如List, Set, Map),泛型,自动装箱拆箱,Annotation,IO流,多线程编程,线程同步(如synchronized关键字...

    Java 面试的笔试题

    20. **错误与调试技巧**:学会阅读和分析堆栈跟踪,使用调试工具进行问题定位。 以上知识点在Java面试中经常被考到,无论是笔试还是面试环节,掌握这些内容将有助于提升你在Java开发者职位的竞争优势。通过阅读提供...

    java面试,经典的八股文208题测试

    - 掌握 Collection 和 Map 接口,以及泛型在容器中的应用。 3. **多线程** - 理解线程的基本概念,如创建线程的方式(Thread 类、Runnable 接口、ExecutorService)。 - 熟悉并发控制机制,如 synchronized、...

    Java案例开发集锦源代码

    4. **集合框架**:List(ArrayList,LinkedList),Set(HashSet,TreeSet),Map(HashMap,TreeMap)等接口和类的使用,以及泛型的理解和应用。 5. **IO流**:字节流和字符流的区别,缓冲流的使用,以及...

    java面试常问题目,java面试常问题目

    - DI(依赖注入):理解依赖注入的原理,使用@Autowired和@Resource注解。 - AOP(面向切面编程):了解切面、通知、切入点表达式等概念,以及Spring AOP的实现。 10. **JVM优化**: - 参数调优:了解JVM启动...

    java面试(常用资料)

    - 泛型:理解泛型的使用和限制,以及通配符的运用。 4. **多线程** - 线程的创建与状态管理:Thread类和Runnable接口的使用,线程的生命周期。 - 同步机制:synchronized关键字,wait()、notify()和notifyAll()...

    java例子分析

    - 注解(Annotation):注解提供了元数据,可以用来编译时或运行时进行代码的处理,如Spring框架中的@Autowired。 -反射:反射API允许在运行时检查类、接口、字段和方法的信息,以及动态创建对象和调用方法。 通过...

    积分管理系统java源码-knowledge:这是我的知识,包括我所有已知的

    annotation 枚举 泛型 反射 字符串和String研究 集合内容,List、Map 文件io和网络io bio、nio和aio 类加载器 常用设计模式 模板模式 单例模式 & 多例模式 代理模式 策略模式 原型模式 工厂模式 委托 其他 Spring5 ...

    2020最强Java面试题共(6000页).zip

    - 泛型:理解泛型的概念,知道如何在类、接口和方法中使用泛型来提高类型安全性。 - Lambda表达式:熟悉函数式编程,掌握Java 8引入的Lambda表达式和Stream API。 - 注解(Annotation):了解注解的定义、使用和...

    《Java 宝典》源代码

    它在许多框架中扮演重要角色,如Spring的依赖注入。 通过对《Java 宝典》的源代码进行学习和实践,读者不仅可以加深对Java语言的理解,还能提升解决问题和设计系统的能力。书中的示例代码涵盖了这些重要知识点,...

    java面试题.zip

    17. **Spring框架**:依赖注入(DI),AOP(面向切面编程),Spring Boot,Spring Cloud等相关知识。 18. **数据库相关**:JDBC连接,SQL语句,事务处理,数据库连接池(如C3P0, HikariCP)。 19. **网络编程**:...

Global site tag (gtag.js) - Google Analytics