今天遇到一个问题,使用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
内容:
Details
-
Type: Bug
-
Status:
-
Priority: Minor
-
Resolution:Duplicate
-
Affects Version/s:
-
Fix Version/s:None
-
Component/s:
-
Labels:None
-
Reference URL:
-
Last commented by a User:true
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
|
<? xml version = "1.0" encoding = "UTF-8" ?>
xsi:schemaLocation="
"> < context:component-scan base-package = "com.example" />
</ beans >
|
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
Activity
- All
- Comments
- Work Log
- History
- Activity
- Transitions
相关推荐
当我们在字段、构造函数、方法或方法参数上使用`@Autowired`时,Spring会自动查找与所需类型匹配的bean,并将其注入到相应的位置。如果找到多个匹配的bean,可以通过指定`@Qualifier`来明确选择一个特定的bean。默认...
Spring框架中,使用@Autowired注解可以将依赖项注入到Bean中,但是当我们需要将依赖项注入到抽象父类时,会遇到一些问题。如果我们直接使用@Autowired注解在抽象父类中,可能不会生效,因为抽象父类不能被实例化。...
在Spring框架中,`@Autowired`和`@Resource`注解是两个常见的依赖注入(DI, Dependency Injection)工具,它们都是用来解决组件之间的耦合问题,使得代码更加灵活和可测试。然而,这两个注解在具体使用时有一些关键性...
- **方法参数注入**:在需要依赖注入的方法参数上使用`@Autowired`,Spring会在调用方法时自动提供参数。 ```java public void doSomething(@Autowired MyService myService) { // ... } ``` ### 3. `@Qualifier`...
在使用 Spring AOP 时,可能会遇到Autowired 依赖注入失败的问题。例如,在使用 Spring AOP 实现操作日志记录时,service 无法被注入。这可能是由于方法的修饰符是 private 导致的。 二、问题分析 在 org.spring...
5. **方法注入**:同样的,你可以在setter方法或者任何带有参数的方法上使用`@Autowired`,Spring会在调用该方法时注入对应的依赖。 6. **注解与XML配置的结合**:在Spring 4中,`@Autowired`可以与XML配置一起使用...
- 不要在`static`字段或静态方法上使用`@Autowired`,因为它们在Spring容器之外初始化,不支持依赖注入。 - 如果`@Autowired`和JSR 330的`@Inject`同时存在,Spring会优先考虑`@Autowired`。 ### 6. 总结 `@...
Spring 注解@Resource 和@Autowired Spring 框架中提供了两个重要的注解,分别是@Resource 和@Autowired,它们都是用于 bean 的自动装配的。了解这两个注解的区别和使用场景是非常重要的。 首先,@Autowired 是 ...
在Spring配置中,我们可以通过`@Configuration`和`@Bean`进一步定制Bean的创建和装配过程,与`@Autowired`和`@Resource`配合使用,实现更加灵活的依赖注入。 总之,`@Autowired`和`@Resource`都是Spring框架中的...
在 SpringBoot 多线程处理任务中无法使用 @Autowired 注入 bean 的问题,可以通过创建一个工具类来解决,这个工具类可以用于获取 bean 对象,从而解决多线程处理任务中无法使用 @Autowired 注入 bean 的问题。
Spring 依赖注入:@Autowired,@Resource 和@Inject 区别与实现原理 Spring 依赖注入是指在应用程序中将对象之间的依赖关系自动装配的过程。Spring 框架提供了多种依赖注入方式,包括 @Autowired、@Resource 和@...
在Java的Spring框架中,`@...总之,`@Autowired`是Spring框架中不可或缺的一部分,它简化了依赖注入的过程,提高了代码的可读性和可维护性。正确理解和使用`@Autowired`,能帮助开发者构建更健壮、更灵活的Spring应用。
Intellij IDEA如何去掉@Autowired 注入警告的方法 在本篇文章中,我们将探讨如何在...去掉@Autowired 注入警告的方法可以使用构造器注入或Setter注入,避免使用Field注入,并使用Lombok提供的注解来简化我们的代码。
Spring Boot项目在使用多线程处理任务时,经常会遇到无法通过@Autowired注入bean的问题。本文将介绍解决该问题的方法,并详细解释原因和解决方案。 问题描述: 在Spring Boot项目中,我们通常使用@Autowired注解...
Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired 问题及解决方法 在 Spring Boot 中集成 Shiro 并使用 JWT 进行接口认证时,可能会遇到自定义 Shiro 过滤器无法使用 @Autowired 问题。下面将详细介绍该问题及...
Spring框架的@Autowired自动装配是其依赖注入(Dependency Injection, DI)机制的核心部分,它极大地简化了Java应用的组件装配和管理。本篇文章将深入探讨@Autowired的XML版本、Annotation版本以及源码层面的理解,...
答案是上面的代码不能正常运行,而且 Spring 还启动报错了,原因是 Spring 想为 Student 注入一个单例的实例,但在注入的过程中意外地发现两个,所以报错,具体错误信息如下: ``` Field stu1 in ...
在使用 @Autowired 注解时,如果在 Spring IOC 容器里面存在多个相同类型的 Bean 实例,那么 Spring 启动的时候,会提示一个错误,大概意思原本只能注入一个单实例 Bean,但是在 IOC 容器里面却发现有多个,导致注入...
`@Autowired`注解是Spring提供的一种依赖注入方式,它能够自动匹配并注入合适的bean。当我们谈论"BeanPostProcessor实现注入的@Autowired注入的对象是增强的代理对象"时,实际上是在讨论如何通过`BeanPostProcessor`...
在Java开发中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它能提高代码的可测试性和可维护性。Spring框架是Java领域中实现DI的典型代表,提供了多种注解来支持这一机制,其中两个常用的注解是...