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
總結
以上是生活随笔為你收集整理的spring map使用annotation泛型注入问题分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pso粒子群优化算法+MATLAB代码
- 下一篇: 晴天前100页评论