Micronaut:从上下文中获取bean的问题

我有一个包含注入和强制(最终)字段的类。通常,我可以使用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",1L};
        BeanDefinition<ObjectInstance> definition = beanContext.getBeanDefinition(ObjectInstance.class);
        ObjectInstance instance =  definition.getconstructor().invoke(args); // there are no injections here: ObjectStorage of instance = null.
    }
}

请告诉我我做错了什么吗?

wozhuai3210 回答:Micronaut:从上下文中获取bean的问题

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

本文链接:https://www.f2er.com/3052149.html

大家都在问