如何解决如何在 micronaut 中注入嵌套内部非静态类?
- micronaut 版本:2.2.1
- Java 版本:11
- 操作系统:Windows 10
我的代码如下:
import io.micronaut.context.annotation.Prototype;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class ParentObject {
@Inject ChildClass childClass;
String keyVar = 'FOO';
public void parentFoo() {
System.out.println("I am foo in parent class");
childClass.childFoo();
}
@Prototype
class ChildClass {
public ChildClass() {}
public void childFoo() {
System.out.println("I am foo in child class. keyVar is"+ ParentObject.this.keyVar);
}
}
}
编译过程正常。但是当代码执行时,会出现以下错误:
Message: com.jcarxmate.test.ParentObject$ChildClass: method <init>()V not found
Path Taken: CoreCommand.testController --> TestController.parentObject --> ParentObject.childClass
at picocli.CommandLine$DefaultFactory.create(CommandLine.java:5201)
at picocli.CommandLine$Model$CommandUserObject.getInstance(CommandLine.java:11160)
at picocli.CommandLine$Model$CommandSpec.userObject(CommandLine.java:5928)
at picocli.CommandLine$Interpreter.clear(CommandLine.java:12323)
at picocli.CommandLine$Interpreter.parse(CommandLine.java:12364)
at picocli.CommandLine$Interpreter.parse(CommandLine.java:12259)
at picocli.CommandLine.parseArgs(CommandLine.java:1458)
at picocli.CommandLine.execute(CommandLine.java:2057)
at io.micronaut.configuration.picocli.PicocliRunner.run(PicocliRunner.java:137)
at io.micronaut.configuration.picocli.PicocliRunner.run(PicocliRunner.java:114)
at com.jcarxmate.CoreCommand.main(CoreCommand.java:29)
Caused by: io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [com.jcarxmate.test.ParentObject]
Message: com.jcarxmate.test.ParentObject$ChildClass: method <init>()V not found
Path Taken: CoreCommand.testController --> TestController.parentObject --> ParentObject.childClass
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1925)
at io.micronaut.context.DefaultBeanContext.getScopedBeanForDefinition(DefaultBeanContext.java:2424)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2339)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2311)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
at io.micronaut.context.AbstractBeanDefinition.getBeanForField(AbstractBeanDefinition.java:1441)
at io.micronaut.context.AbstractBeanDefinition.getBeanForField(AbstractBeanDefinition.java:1203)
at com.jcarxmate.test.$ParentObjectDefinition.injectBean(Unknown Source)
at com.jcarxmate.test.$ParentObjectDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2679)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2665)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2337)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2311)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
at io.micronaut.context.AbstractBeanDefinition.getBeanForField(AbstractBeanDefinition.java:1441)
at io.micronaut.context.AbstractBeanDefinition.getBeanForField(AbstractBeanDefinition.java:1203)
at com.jcarxmate.test.$TestControllerDefinition.injectBean(Unknown Source)
at com.jcarxmate.test.$TestControllerDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2679)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2665)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2337)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2311)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
at io.micronaut.context.AbstractBeanDefinition.getBeanForField(AbstractBeanDefinition.java:1441)
at io.micronaut.context.AbstractBeanDefinition.getBeanForField(AbstractBeanDefinition.java:1203)
at com.jcarxmate.$CoreCommandDefinition.injectBean(Unknown Source)
at com.jcarxmate.$CoreCommandDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultBeanContext.getScopedBeanForDefinition(DefaultBeanContext.java:2424)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2339)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2311)
at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:1266)
at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:744)
at io.micronaut.context.BeanLocator.findOrInstantiateBean(BeanLocator.java:163)
at io.micronaut.configuration.picocli.MicronautFactory.create(MicronautFactory.java:73)
at picocli.CommandLine$DefaultFactory.create(CommandLine.java:5197)
... 10 more
Caused by: java.lang.NoSuchMethodError: com.jcarxmate.test.ParentObject$ChildClass: method <init>()V not found
at com.jcarxmate.test.$ParentObject$ChildClassDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
... 47 more
如果我从行 @Inject
中删除 @Inject ChildClass childClass;
并添加 childClass = new ChildClass();
如下,它会起作用:
public void parentFoo() {
System.out.println("I am foo in parent class");
childClass = new ChildClass();
childClass.childFoo();
}
但我还是希望尽可能使用@Inject。但是,我不能使用嵌套静态类,因为 ChildClass
必须访问父类中的变量和方法。
那么,有什么建议吗?谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。