首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Guice注入空指针

Guice注入空指针
EN

Stack Overflow用户
提问于 2012-11-08 13:28:52
回答 2查看 21.5K关注 0票数 18

我们试着用Guice重构一个项目。这样做的目的是将所有语言接口绑定到像法语或波兰语这样的组合对象上。

我们有一个绑定模块:

代码语言:javascript
运行
AI代码解释
复制
public class StandardModule extends AbstractModule {

    @Override
    protected void configure() {

       bind(Language.class).to(Polish.class);

    }
 }

以及使用该注入对象的类(AboutDialog.java):

代码语言:javascript
运行
AI代码解释
复制
@Inject Language language;

public AboutDialog(JFrame parent) {
    super(parent, "", true);
    this.language=language;
    this.setTitle(language.getLanguageInUse().getString("AboutDialog.title"));
    this.parent = parent;
    try {
        jbInit();
    } catch (Exception e) {
        e.printStackTrace();
    }
    pack();
}

结果是:

代码语言:javascript
运行
AI代码解释
复制
java.lang.NullPointerException at net.sf.jmoney.gui.AboutDialog.<init>(AboutDialog.java:67)

第67行是:

代码语言:javascript
运行
AI代码解释
复制
this.setTitle(language.getLanguageInUse().getString("AboutDialog.title"));

我们的接口是:

代码语言:javascript
运行
AI代码解释
复制
public interface Language {

    public ResourceBundle getLanguageInUse();
}

波兰班是:

代码语言:javascript
运行
AI代码解释
复制
public class Polish implements Language {

    private ResourceBundle languageInUse;

    public Polish() {
        languageInUse = ResourceBundle.getBundle(Constants.LANGUAGE_PL);
    }

    public ResourceBundle getLanguageInUse() {
        return languageInUse;
    }


}

我们迷路了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-08 13:46:05

我假设您的AboutDialog不是在Guice的帮助下创建的。

您可以做的是使用injector.injectMembers(this),其中thisAboutDialog

最好的方法是,AboutDialog将由Guice创建,因此所有成员都将被注入。

票数 11
EN

Stack Overflow用户

发布于 2012-11-08 19:21:36

你用的是“现场注射”。这将使您很难在构造函数中使用注入的值;即使Guice要创建对象(现在不是这样),或者使用injector.injectMembers(aboutDialog),构造函数也会在注入器有机会注入您想要的字段之前运行。

创建一个接受不同参数和注入参数的类要复杂一些。这给您留下了几个选择:

  • 注射JFrame。如果您知道在创建构造函数时要使用什么JFrame,那么只需在模块中使用bind(JFrame.class).toInstance(myJFrame);即可。然后Guice可以完全创建AboutDialog。
  • 手动创建工厂。这样,您就可以注入AboutDialog.Factory,只需调用create来获取AboutDialog。看起来会是这样的: 公共类AboutDialog扩展了JDialog { /**可注入工厂。*/公共静态类工厂{@注入私有语言语言;公共AboutDialog创建(JFrame父){返回新AboutDialog(父级,语言);} //无@注入参数;您在上面调用“新”您自己!公共AboutDialog(JFrame父语言,语言){超级(父,“,真);this.language = language;// .其他初始化}
  • 创建一个工厂,让Guice通过assisted injection为您连接。 公共类AboutDialog扩展了JDialog {公共接口工厂{公共AboutDialog创建( JFrame父);} //您需要@Inject,也需要@Assisted告诉Guice //使用参数,而不是Guice绑定@Inject公共AboutDialog(@Assisted JFrame parent,language) {Super(父级,“,”,真);this.language = language;// .其他初始化}}公共类StandardModule扩展了AbstractModule {@重载受保护的空配置(){ bind(Language.class).to(Polish.class);//这里,AboutDialog.Factory中的每个方法都将实现//以基于//参数(如JFrame)和绑定(类似于语言)安装(新的AboutDialog })来创建方法的返回类型AboutDialog。

正如问题注释中所指出的,确保您正在获取AboutDialog (或AboutDialog.Factory通过@Injected构造函数/字段或从Injector本身获得),否则Guice将不知道注入参数。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13298128

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文