我有一个包含注入和强制(最终)字段的类。通常,我可以使用MicronautBeanFactory.getBean(type)或BeanContext.getBean(type)从上下文中获取bean,但是在这种情况下,我必须传递type和args。
我为此创建了简单的测试
@MicronautTest
public class ETLExecutorTest {
@Inject
private MicronautBeanFactory micronautBeanFactory;
@Test
void testGetBean() {
Object[] args = new Object[] {"name", "spec", 1L};
ObjectInstance instance = micronautBeanFactory.getBean(ObjectInstance.class, args);
}
}
对象(bean)代码
@Prototype
public class ObjectInstance {
@Inject
private ObjectStorage objectStorage;
private final String name;
private final String spec;
private final Long id;
public ObjectInstance(String name, String spec, Long id) {
this.name = name;
this.spec = spec;
this.id = id;
}
}
当我运行它时,我会收到异常
io.micronaut.context.exceptions.DependencyInjectionException:无法为类com.ObjectInstance的参数[名称]注入值 消息:找到了多个可能的bean候选:[java.lang.String,java.lang.String,java.lang.String] 采取的路径:新的ObjectInstance([String name],String specName,Long accountId) 在io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1016) 在com。$ TableInstanceDefinition.build中(未知来源) 在io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1598) 在io.micronaut.context.DefaultBeanContext.getScopedBeanForDefinition(DefaultBeanContext.java:2076) 在io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1991) 在io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1963) 在io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:610) 在io.micronaut.spring.context.factory.MicronautBeanFactory.getBean(MicronautBeanFactory.java:264) 引起原因:io.micronaut.context.exceptions.NonUniqueBeanException:找到了多个可能的bean候选:[java.lang.String,java.lang.String,java.lang.String] 在io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:1701) 在io.micronaut.context.DefaultApplicationContext.findConcreteCandidate(DefaultApplicationContext.java:395) 在io.micronaut.context.DefaultBeanContext.lastChanceResolve(DefaultBeanContext.java:2289) 在io.micronaut.context.DefaultBeanContext.findConcreteCandidateNoCache(DefaultBeanContext.java:2212) 在io.micronaut.context.DefaultBeanContext.lambda $ findConcreteCandidate $ 57(DefaultBeanContext.java:2155) 在io.micronaut.core.util.clhm.ConcurrentLinkedHashMap.lambda $ compute $ 0(ConcurrentLinkedHashMap.java:721) 在java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) 在io.micronaut.core.util.clhm.ConcurrentLinkedHashMap.compute(ConcurrentLinkedHashMap.java:733) 在io.micronaut.core.util.clhm.ConcurrentLinkedHashMap.computeIfAbsent(ConcurrentLinkedHashMap.java:710) 在io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:2154) 在io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1943) 在io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1082) 在io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1007)
我也尝试进行另一项测试,但是在这种情况下,我收到的对象没有注入字段
@MicronautTest
public class ETLExecutorTest {
@Inject
private BeanContext beanContext;
@Test
void testGetBean() {
Object[] args = new Object[] {"name", "spec", 1L};
BeanDefinition<ObjectInstance> definition = beanContext.getBeanDefinition(ObjectInstance.class);
ObjectInstance instance = definition.getConstructor().invoke(args); // there are no injections here: ObjectStorage of instance = null.
}
}
请告诉我我做错了什么吗?
答案 0 :(得分:1)
micronaut
尝试通过构造函数创建bean ObjectInstance
,但是找不到要注入的String name
,看起来这只是{ {1}},在这种情况下,可以正常工作:
io.micronaut.context.exceptions.DependencyInjectionException:无法为参数[name]注入值
如果添加默认构造函数,则将创建ObjectInstance
,并且可以通过ObjectInstance
获取bean:
beanContext.getBean(ObjectInstance.class)
还要注意MicronautBeanFactory的实现ListableBeanFactory,这是为了与@Prototype
public class ObjectInstance {
@Inject
private ObjectStorage objectStorage;
private String name;
private String spec;
private Long id;
public ObjectInstance() {}
public ObjectInstance(String name, String spec, Long id) {
this.name = name;
this.spec = spec;
this.id = id;
}
}
集成
P.S。我建议您更改代码结构,Spring
不应包含POJO