我需要一些关于guice注入的澄清,因为我花了几天时间试图理解它在我的特定环境中是如何工作的,但没有取得积极的结果。
我有一个基于dropwizard环境构建的java应用程序(不确定是否相关)。
入口点是创建guice注入器的经典main:
injector = Guice.createInjector(new MyAppModule(configuration, environment));
myappmodule是我将接口类绑定到实现的地方:
bind(EventService.class).to(MyEventServiceImpl.class).asEagerSingleton();
eventservice必须是一个托管的单例,它需要guice以防出现其他实现,目前我只有一个。
现在,我需要的注入应该发生在基类baseexception中,这里有以下代码:
public class BaseException extends RuntimeException {
private final int statusCode;
private final int errorCode;
private final String errorDetails;
@Inject
private EventService eventService;
public BaseException(int statusCode, int errorCode, String errorDetails) {
this(statusCode, errorCode, null, errorDetails);
}
@Inject
public BaseException(int statusCode, int errorCode, String errorMessage, String errorDetails) {
super(errorMessage);
this.statusCode = statusCode;
this.errorCode = errorCode;
this.errorDetails = errorDetails;
// this.eventService = eventService // this would require parameter passing here and on all children classes?
notifyEventService();
}
public void notifyEventService()
{
eventService.send(MyEnum.TYPE, super.getMessage());
}
}
然后我有一个子类mycustomexception:
public class MyCustomException extends BaseException {
public MyCustomException(int statusCode, int errorCode, String errorMessage, String errorDetails) {
super(statusCode, errorCode, errorMessage, errorDetails);
}
}
其思想是,在每个自定义异常时触发事件服务通知。问题是eventservice对象并没有真正被注入,我不知道这是一个设计问题,还是我对guice的误解。
当我试图抛出mycustomexception时,我得到一个 "Exception in thread "main" java.lang.NullPointerException"
相反。notifyeventservice()方法中的eventservice为空值。我尝试了几个@inject组合,但无法访问eventservice对象。
我对guice很陌生,但是我读了很多书,看了很多例子,我认为主要的想法是它可以神奇地获得在injector中创建的singleton示例,无论我尝试从哪个类访问它。这里的许多解决方案都涉及使用 injector.getInstance(EventService.class)
但我需要一个参考资料,它看起来很脏。在这一点上我愿意接受任何建议。
暂无答案!
目前还没有任何答案,快来回答吧!