Spring AnnotationConfigApplicationContext.scan() 正在扫描错误的包
Spring AnnotationConfigApplicationContext.scan() is scanning wrong package
我的class(MyClass.java
)在某个包(packageC
)中使用了导致以下错误的注释:
NoSuchBeanDefinitionException: No qualifying bean of type [com.foo.SomeAnnotation] is defined
使用的注释来自第 3 方库 (com.foo
)
我没有使用 XML 配置 Spring。我所做的是,在我的应用程序设置期间,我创建了一个 AnnotationConfigApplicationContext
对象,我用它来扫描包中带注释的 classes,然后从该 classes 创建 bean。
应用程序初始化程序:
...
final private AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
public void initApp() {
//packageC is not scanned
ctx.scan("packageA", "packageB");
ctx.refresh();
}
// Called by the application when a bean is required
public <A> A getBeanForClass(Class<A> clazz) {
return ctx.getBean(clazz);
}
...
因为我知道第 3 方库中的注释不能由 Spring 管理(相反,Spring 不能从该库创建 bean)我已经从扫描中排除了我的包其中包含 classes 使用第 3 方注释:
packageC.MyClass
package packageC
import com.foo.Annotation
public class MyClass {
...
@Annotation
public void someMethod() {
...
}
}
我的问题是,如果我没有告诉 Spring 从 "packageC" 中带注释的 classes 创建 bean,为什么会出现错误???
我必须补充一点,someMethod()
在扫描的包裹中使用了 class 中的一个对象。
我可能太含糊了,但我想专注于 AnnotationConfigApplicationContext
的 scan
行为,而不是试图开始讨论实施细节。
无论如何,这里是我申请的一些细节:
- 该应用程序使用 Play!框架 (v2.3.8)
- Spring 初始化在
Global
对象中完成(根据 Play-Spring-Jpa 教程)
- 'offending' 第三个库是
Deadbolt
(带有 @Restrict
注释)
感谢您给我的任何说明:)
编辑:
我在 play-framework google group 上发现了一个相关问题。请注意,那里的人实际上正在扫描带有注释 classes 的包裹……我不是。
您应该添加注释,例如 @Component
或 @Configuration
或 @Service
在[com.foo.SomeAnnotation]
class的开头,让spring上下文知道它。
是一个 spring bean。
我的class(MyClass.java
)在某个包(packageC
)中使用了导致以下错误的注释:
NoSuchBeanDefinitionException: No qualifying bean of type [com.foo.SomeAnnotation] is defined
使用的注释来自第 3 方库 (com.foo
)
我没有使用 XML 配置 Spring。我所做的是,在我的应用程序设置期间,我创建了一个 AnnotationConfigApplicationContext
对象,我用它来扫描包中带注释的 classes,然后从该 classes 创建 bean。
应用程序初始化程序:
...
final private AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
public void initApp() {
//packageC is not scanned
ctx.scan("packageA", "packageB");
ctx.refresh();
}
// Called by the application when a bean is required
public <A> A getBeanForClass(Class<A> clazz) {
return ctx.getBean(clazz);
}
...
因为我知道第 3 方库中的注释不能由 Spring 管理(相反,Spring 不能从该库创建 bean)我已经从扫描中排除了我的包其中包含 classes 使用第 3 方注释:
packageC.MyClass
package packageC
import com.foo.Annotation
public class MyClass {
...
@Annotation
public void someMethod() {
...
}
}
我的问题是,如果我没有告诉 Spring 从 "packageC" 中带注释的 classes 创建 bean,为什么会出现错误???
我必须补充一点,someMethod()
在扫描的包裹中使用了 class 中的一个对象。
我可能太含糊了,但我想专注于 AnnotationConfigApplicationContext
的 scan
行为,而不是试图开始讨论实施细节。
无论如何,这里是我申请的一些细节:
- 该应用程序使用 Play!框架 (v2.3.8)
- Spring 初始化在
Global
对象中完成(根据 Play-Spring-Jpa 教程) - 'offending' 第三个库是
Deadbolt
(带有@Restrict
注释)
感谢您给我的任何说明:)
编辑:
我在 play-framework google group 上发现了一个相关问题。请注意,那里的人实际上正在扫描带有注释 classes 的包裹……我不是。
您应该添加注释,例如 @Component
或 @Configuration
或 @Service
在[com.foo.SomeAnnotation]
class的开头,让spring上下文知道它。
是一个 spring bean。