`
kanpiaoxue
  • 浏览: 1781930 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring使用@Autowired不能注入BlockingQueue的问题

 
阅读更多

 

今天遇到一个问题,使用spring4配置BlockingQueue,在Java代码里面使用@Autowired注释方式注入该BlockingQueue,一直报错。

我的代码如下:

    @Autowired
    private BlockingQueue<CoreTask> alarmInnerQueue;

 

我的XML如下:

<bean id="alarmInnerQueue" class="org.kanpiaoxue.test.concurrent.UniqueLinkedBlockingQueue"/>

 说明一下,UniqueLinkedBlockingQueue 这个类是BlockingQueue的一个实现,我自己写的。

报错如下:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.util.concurrent.BlockingQueue com.baidu.rigel.dmap.sf.service.impl.AlarmFailureServiceImplTest.alarmInnerQueue; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.util.HashMap$Values' to required type 'java.util.concurrent.BlockingQueue'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.util.HashMap$Values] to required type [java.util.concurrent.BlockingQueue]: no matching editors or conversion strategy found
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
	... 26 more
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.util.HashMap$Values' to required type 'java.util.concurrent.BlockingQueue'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.util.HashMap$Values] to required type [java.util.concurrent.BlockingQueue]: no matching editors or conversion strategy found
	at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:74)
	at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:40)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1014)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:527)
	... 28 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.util.HashMap$Values] to required type [java.util.concurrent.BlockingQueue]: no matching editors or conversion strategy found
	at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:287)
	at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:107)
	at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:64)
	... 32 more

 最后在spring的网站发现这是一个Bug,到现在还没有修复。而是采用了配置

javax.annotation.Resource的方式来绕过这个BUG。

正确的代码如下:

    @Resource(name="alarmInnerQueue")
    private BlockingQueue<CoreTask> alarmInnerQueue;

 

 

网站地址:https://jira.spring.io/browse/SPR-7798

http://forum.spring.io/forum/spring-projects/container/64548-problem-injecting-blockingqueue-by-applicationcontext-xml

内容:

Details

  • Type:Bug Bug
  • Status:RESOLVED
  • Priority:Minor Minor
  • Resolution:Duplicate
  • Affects Version/s:3.0.5
  • Fix Version/s:None
  • Component/s:Core:AOP
  • Labels:
    None

Description

Cannot @Autowire to inject an instance of java.util.concurrent.BlockingQueue. The above forum has a post from 2009. I was able to reproduce this problem and have attached a minimal example. This works with XML based bean configuration but not with the annotation @Autowired.

AppComponent.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.example;
 
import java.util.concurrent.BlockingQueue;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
 
@Component
public class AppComponent {
 
    @Autowired
    public BlockingQueue queue;
 
    public static void main(String[] args) {
 
        new ClassPathXmlApplicationContext("com/example/context.xml").getBean(AppComponent.class);
    }
}

Config.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.example;
 
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class Config {
 
    @Bean
    public BlockingQueue blockingQueue() {
        return new LinkedBlockingQueue();
    }
}

context.xml:

1
2
3
4
5
6
7
8
9
10
11
12

The runtime error is:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appComponent': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public java.util.concurrent.BlockingQueue com.example.AppComponent.queue; nested exception is org.springframework.beans.FatalBeanException: No element type declared for collection [java.util.concurrent.BlockingQueue]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.example.AppComponent.main(AppComponent.java:17)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: public java.util.concurrent.BlockingQueue com.example.AppComponent.queue; nested exception is org.springframework.beans.FatalBeanException: No element type declared for collection [java.util.concurrent.BlockingQueue]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502)
    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: No element type declared for collection [java.util.concurrent.BlockingQueue]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:740)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
    ... 15 more

Attachments

Issue Links

is superseded by

Activity

 
Michael F added a comment - 05/Jul/11 7:13 AM

(I posted the same response in the forum thread linked above.)

If you want auto-wire the Queue try to use JSR-250's @Resource annotation and a reasonable qualifier. Spring supports these annotations and should correctly inject the queue.)

1
2
3
4
5
@Component
public class B {
  @Resource(name="myBlockingQueue")
  private BlockingQueue<Integer> blockingQueue;
}

@Autowired and @Resource behave differently.

Background info can be found in the documentation: Fine-tuning annotation-based autowiring with qualifiers

Chris Beams added a comment - 07/Jul/11 6:51 PM

Please see SPR-8519, which aims to address this and a number of other similar issues related to collection autowiring.

Marty Kube added a comment - 10/Jul/11 6:16 PM

Great, thanks. @Resource solved the issue.

分享到:
评论

相关推荐

    通过@Autowired注解注入bean的顺序,以及@bean注入.rar

    当我们在字段、构造函数、方法或方法参数上使用`@Autowired`时,Spring会自动查找与所需类型匹配的bean,并将其注入到相应的位置。如果找到多个匹配的bean,可以通过指定`@Qualifier`来明确选择一个特定的bean。默认...

    Spring使用@Autowired为抽象父类注入依赖代码实例

    Spring框架中,使用@Autowired注解可以将依赖项注入到Bean中,但是当我们需要将依赖项注入到抽象父类时,会遇到一些问题。如果我们直接使用@Autowired注解在抽象父类中,可能不会生效,因为抽象父类不能被实例化。...

    (转)Spring中@Autowired注解和@Resource注解的区别

    在Spring框架中,`@Autowired`和`@Resource`注解是两个常见的依赖注入(DI, Dependency Injection)工具,它们都是用来解决组件之间的耦合问题,使得代码更加灵活和可测试。然而,这两个注解在具体使用时有一些关键性...

    Spring使用@Autowired注解自动装配

    - **方法参数注入**:在需要依赖注入的方法参数上使用`@Autowired`,Spring会在调用方法时自动提供参数。 ```java public void doSomething(@Autowired MyService myService) { // ... } ``` ### 3. `@Qualifier`...

    因Spring AOP导致@Autowired依赖注入失败的解决方法

    在使用 Spring AOP 时,可能会遇到Autowired 依赖注入失败的问题。例如,在使用 Spring AOP 实现操作日志记录时,service 无法被注入。这可能是由于方法的修饰符是 private 导致的。 二、问题分析 在 org.spring...

    SSH笔记-通过@Autowired配置注入关系

    5. **方法注入**:同样的,你可以在setter方法或者任何带有参数的方法上使用`@Autowired`,Spring会在调用该方法时注入对应的依赖。 6. **注解与XML配置的结合**:在Spring 4中,`@Autowired`可以与XML配置一起使用...

    Spring@Autowired注解与自动装配.rar

    - 不要在`static`字段或静态方法上使用`@Autowired`,因为它们在Spring容器之外初始化,不支持依赖注入。 - 如果`@Autowired`和JSR 330的`@Inject`同时存在,Spring会优先考虑`@Autowired`。 ### 6. 总结 `@...

    Spring注解@Resource和@Autowired.doc

    Spring 注解@Resource 和@Autowired Spring 框架中提供了两个重要的注解,分别是@Resource 和@Autowired,它们都是用于 bean 的自动装配的。了解这两个注解的区别和使用场景是非常重要的。 首先,@Autowired 是 ...

    Spring In Action 使用@Autowired 和@ Resource 自动装配Bean

    在Spring配置中,我们可以通过`@Configuration`和`@Bean`进一步定制Bean的创建和装配过程,与`@Autowired`和`@Resource`配合使用,实现更加灵活的依赖注入。 总之,`@Autowired`和`@Resource`都是Spring框架中的...

    详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决

    在 SpringBoot 多线程处理任务中无法使用 @Autowired 注入 bean 的问题,可以通过创建一个工具类来解决,这个工具类可以用于获取 bean 对象,从而解决多线程处理任务中无法使用 @Autowired 注入 bean 的问题。

    详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理

    Spring 依赖注入:@Autowired,@Resource 和@Inject 区别与实现原理 Spring 依赖注入是指在应用程序中将对象之间的依赖关系自动装配的过程。Spring 框架提供了多种依赖注入方式,包括 @Autowired、@Resource 和@...

    Spring @Autowired

    在Java的Spring框架中,`@...总之,`@Autowired`是Spring框架中不可或缺的一部分,它简化了依赖注入的过程,提高了代码的可读性和可维护性。正确理解和使用`@Autowired`,能帮助开发者构建更健壮、更灵活的Spring应用。

    Intellij IDEA如何去掉@Autowired 注入警告的方法

    Intellij IDEA如何去掉@Autowired 注入警告的方法 在本篇文章中,我们将探讨如何在...去掉@Autowired 注入警告的方法可以使用构造器注入或Setter注入,避免使用Field注入,并使用Lombok提供的注解来简化我们的代码。

    解决SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题

    Spring Boot项目在使用多线程处理任务时,经常会遇到无法通过@Autowired注入bean的问题。本文将介绍解决该问题的方法,并详细解释原因和解决方案。 问题描述: 在Spring Boot项目中,我们通常使用@Autowired注解...

    Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法

    Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired 问题及解决方法 在 Spring Boot 中集成 Shiro 并使用 JWT 进行接口认证时,可能会遇到自定义 Shiro 过滤器无法使用 @Autowired 问题。下面将详细介绍该问题及...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    Spring框架的@Autowired自动装配是其依赖注入(Dependency Injection, DI)机制的核心部分,它极大地简化了Java应用的组件装配和管理。本篇文章将深入探讨@Autowired的XML版本、Annotation版本以及源码层面的理解,...

    详解Spring @Autowired 注入小技巧

    答案是上面的代码不能正常运行,而且 Spring 还启动报错了,原因是 Spring 想为 Student 注入一个单例的实例,但在注入的过程中意外地发现两个,所以报错,具体错误信息如下: ``` Field stu1 in ...

    【Java面试】@Resource 和 @Autowired 的区别.doc

    在使用 @Autowired 注解时,如果在 Spring IOC 容器里面存在多个相同类型的 Bean 实例,那么 Spring 启动的时候,会提示一个错误,大概意思原本只能注入一个单实例 Bean,但是在 IOC 容器里面却发现有多个,导致注入...

    BeanPostProcessor实现注入的@Autowired注入的对象是增强的代理对象.rar

    `@Autowired`注解是Spring提供的一种依赖注入方式,它能够自动匹配并注入合适的bean。当我们谈论"BeanPostProcessor实现注入的@Autowired注入的对象是增强的代理对象"时,实际上是在讨论如何通过`BeanPostProcessor`...

    1.@Resource是按名称进行注入的,属于java自带的。@Autowired是按类型进行注入的,属于Spring。.pdf

    在Java开发中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它能提高代码的可测试性和可维护性。Spring框架是Java领域中实现DI的典型代表,提供了多种注解来支持这一机制,其中两个常用的注解是...

Global site tag (gtag.js) - Google Analytics