我有一些来自外部库的java对象,我需要在spring项目中注入。问题是库中的类不知道任何spring api的
如果我使用@Autowired将bean从库注入服务,我将获得org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type
以下是我的服务类
@Path("/test")
public class TestService {
@Autowired
SomeOtherClass service;
@GET
public Response get(){
return Response.ok(service.someMethod()).build();
}
}
以下是来自图书馆的我不知道春天的课程
public class SomeOtherClass {
public String someMethod(){
return "Data from library";
}
}
当我调用我的服务时,我得到例外
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.SomeOtherClass' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
春天是否有办法注入一个类似于**CDI**
注入的普通Java对象?
有一个选项可以定义applicationcontext.xml并在xml中定义SomeOtherClass并使用getBean,但我不想这样做。还有其他选择吗?
注意:
以下选项无法考虑,因为我有来自库
的100's
个类
Cannot use applicationcontext.xml
Cannot @Configuration @Bean to produce beans
。
答案 0 :(得分:4)
您可以使用@Configuration和@Bean注释,如下所示 -
创建一个新类:
@Configuration
public class AppConfig {
@Bean
SomeOtherClass someOtherClassBean(){ return new SomeOtherClass();}
}
现在汽车接线应该工作。 它的作用,实际上是创建一个bean并让Spring了解它。
答案 1 :(得分:1)
也许尝试以编程方式将bean添加到IoC容器中: Add Bean Programmatically to Spring Web App Context
您需要找到要实例化的所有类,并使用链接问题中的一种方法。
答案 2 :(得分:1)
您可以使用反射以编程方式添加Bean定义。
git log --graph
随后,这些bean可能在其他地方 @Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
Reflections ref = new Reflections(new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
.setUrls(ClasspathHelper.forPackage(PACKAGE_NAME))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(PACKAGE_NAME))));
ref.getSubTypesOf(Object.class).stream()
.forEach(clazz -> {
logger.info("Defining pojo bean: {} -> {}", Introspector.decapitalize(clazz.getSimpleName()), clazz.getCanonicalName());
registry.registerBeanDefinition(Introspector.decapitalize(clazz.getSimpleName()),
BeanDefinitionBuilder.genericBeanDefinition(clazz).getBeanDefinition());
});
}
。见Gist:https://gist.github.com/ftahmed/a7dcdbadb8bb7dba31ade463746afd04