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



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

  

  

	@Autowiredpublic 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

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

  

  

	@Autowiredpublic 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

转载于:https://www.cnblogs.com/zhwj184/archive/2013/04/15/3027417.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抽象类-(抽象类的样子)

/* 抽象类&#xff1a; 1.继承时使用 2.抽象类不能被实例化 3.可以继承抽象类后再调用作用&#xff1a; 保证继承的完整性*/abstract class Animal4{public abstract void eat(); }class Cat4 extends Animal4{public void eat(){System.out.println("猫吃鱼");} } c…

宋体、文件-Ubuntu Linux中配置adb-by小雨

最近研究宋体、文件-&#xff0c;稍微总结一下&#xff0c;以后继续补充&#xff1a; 当前用户 sudo vi .bashrc 在这个文件中入加&#xff1a; export PATH”$PATH:export PATH"$PATH:/home/[username]/android-sdk-linux_86/platform-tools/" 启重后失效 全局设置 …

接口(多继承)

1.继承类时不支持多继承 2.接口可以多继承接口&#xff0c;但接口不能继承类 3.类之间单继承&#xff0c;接口之间多继承 4.继承和实现的区别&#xff1a; 继承是类关系&#xff0c;单继承。实现是类和接口之间的关系&#xff0c;多实现 单继承有局限性&#xff0c;多实现…

[数据结构]之栈

[数据结构]之栈 ##1 描述 栈&#xff1a;后进先出的数据结构。栈是封底的&#xff0c;只能从一个方向写入读出。栈的实现有两种&#xff0c;基于顺序表方式和基于链表方式。栈的场景&#xff1a;比如浏览器的返回场景。顺序表实现&#xff1a;1&#xff09;在顺序表的基础上创建…

接口(定义,使用方法)

/* 接口&#xff1a; 1.定义&#xff1a;当一个抽象类&#xff0c;里面全是抽象方法时&#xff0c;叫做接口 2.定义方式&#xff1a;interface 3.成员变量定义方式&#xff1a;public static final 数据类型 变量名 值&#xff1b;------变成常量public abstract 返回值类型 方…

内部类的使用方法

/* 内部类&#xff1a; 1.内部类定义 2.内部类的三种格式&#xff1a; 1.内部类是非静态修饰&#xff0c;内部类方法是非静态修饰 外部类名.内部类名 变量名 new 外部类对象. new 内部类对象&#xff08;&#xff09;&#xff1b; 变量名.内部类方法&#xff08;&#xff09;…

TFS集群数据对比

TFS没有采用目前流行的3副本策略&#xff0c;而是使用集群内配置2个副本&#xff0c;并把数据同步到一个辅集群&#xff0c;辅集群同样配置2个副本&#xff1b;这种方式对于实现异地机房容灾很方便&#xff0c;辅集群的数据同步是由主集群的数据服务器在后台发起的&#xff1b;…

匿名类接口对象

interface MyInter1{public abstract void show();public abstract void show1(); } class OUter{public void outer(){//接口引用指向自己的实现类对象&#xff0c;多态调用MyInter1 M new MyInter1(){public void show(){System.out.println("匿名类对象show");}p…

Sesame 2.7.0 发布,Java 的 RDF 开发包

Sesame 2.7.0 开始使用 Maven Central&#xff0c;要求至少 Java 6 支持&#xff0c;SailConnection.begin() 指示事务开始&#xff0c;新的 Model 接口扩展了 Graph&#xff0c;OpenRDF Workbench 支持基本的 HTTP AUTHN&#xff0c;查询结果分页和保存查询结果&#xff0c;支…

(JAVA)Object类之toString()和equals()

Object类&#xff1a;存储于java.lang包中&#xff0c;有构造方法&#xff0c;无super 一.toString():返回该对象的字符串表示-----String类型&#xff0c;输出类型中&#xff0c;默认调用toString()1.public String toString() {return getClass().getName() "" I…

“四方定理”--蓝桥杯

欢迎访问我的新博客&#xff1a;http://www.milkcu.com/blog/ 原文地址&#xff1a;http://www.milkcu.com/blog/archives/1366349160.html 题目描述 标题&#xff1a;四方定理 数论中有著名的四方定理&#xff1a;所有自然数至多只要用四个数的平方和就可以表示。 我们可以通过…

(JAVA)Object类之Scanner

/* Scanner类&#xff1a;使用正则表达式解析基本类型和字符串的简单文本扫描器 一.源代码&#xff1a;public final class Scanner implements Iterator<String>, Closeable {...}1.不允许继承2.使用时必须导入包 import java.util.Scanner&#xff1b; jdk1.5以上版本才…

序列化 小复习

想要序列化一个对象则需要使其继承serializable或者externalizable接口 一下是一个实例小程序&#xff1a; ser_test 1 import java.io.*;2 3 public class ser_test{4 public static void main(String[] args) throws Exception{5 person p1 new person(1,1.2,&q…

windows设备坐标和逻辑坐标的转换

设备坐标通俗的讲就是我们看到的我们的视图坐标&#xff0c;它包含屏幕坐标、窗体坐标和客户区坐标&#xff0c;他们都是以窗体的左上角为准的坐标&#xff0c;并且是从左到右&#xff0c;从上到下的坐标 简单总结一下他的特点&#xff1a;x坐标是从左到右&#xff0c;y坐标是从…