当前位置: 首页 > 知识库问答 >
问题:

在JavaEE中使用@inject注释时的NullPointerException

赵征
2023-03-14
@Singleton
public class QuotesLoaderBean {

Properties quotes;
Properties names;
@Inject
public QuoteRepository repo;

public QuotesLoaderBean() {
}

@PostConstruct
public void init() {
    InputStream quotesInput = this.getClass().getClassLoader().getResourceAsStream("quotes.properties");
    InputStream namesInput = this.getClass().getClassLoader().getResourceAsStream("names.properties");

    quotes = new Properties();
    names = new Properties();
    try {
        quotes.load(quotesInput);
        names.load(namesInput);
    } catch (IOException ex) {
        Logger.getLogger(QuotesLoaderBean.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public Citation createCitation(String quote) {
    Citation citation = new Citation();
    citation.setQuote(quote);
    citation.setWho(getName());
    repo.save();
    return citation;
}

public Citation getCitation() {
    Citation citation = new Citation();
    citation.setQuote(getQuote());
    citation.setWho(getName());
    return citation;
}

public String getQuote() {
    Enumeration keys = quotes.propertyNames();
    int elementNumber = new Random().nextInt(quotes.keySet().size());
    return quotes.getProperty(getElement(keys, elementNumber));
}

public String getName() {
    Enumeration keys = names.propertyNames();
    int elementNumber = new Random().nextInt(names.keySet().size());
    return names.getProperty(getElement(keys, elementNumber));
}

private String getElement(Enumeration keys, int elementNumber) {
    int i = 0;
    while (keys.hasMoreElements()) {
        if (i == elementNumber) {
            return (String) keys.nextElement();
        } else {
            i++;
            keys.nextElement();
        }
    }
    return null;
}
}
@Singleton
public class QuoteRepository {

public String save() {
    Gson gson = new GsonBuilder().create();
    return "Saved...";
}

}

共有1个答案

毕泽宇
2023-03-14

当我测试createCitation方法时,我总是得到一个NullPointerException

您不能简单地测试您的应用程序,因为您将创建对象的责任委托给了容器,而容器在单元测试中(我假设您使用它)是不存在的。

public Citation createCitation(String quote) {
    Citation citation = new Citation();
    citation.setQuote(quote);
    citation.setWho(getName());
    repo.save(); // repo isn't initialized
    return citation;
}

如果要测试代码,请模拟repo对象或使用集成测试。

 类似资料:
  • 我是匕首2和科特林的新手。获取未初始化的延迟属性。 我有一个模块,它有几个@Provides方法,但其中一个类无法创建使用@Inject和lateinit的对象。 登录服务以“LoginAPI”为参数,工作正常,但我希望所有与登录相关的API都使用相同的服务。还有一个与API相关的“LoginWithOrgAPI”。 现在我的需求是在LoginService类中获取任何需要时的API对象。所以我尝

  • 我已经在我的项目中实现了Hilt依赖项,但是当我需要构造函数的@inject注释时,它就不起作用了。基本上,当我试图手动导入它时,我发现javax中的inject文件夹是空的。因此该结构类似于javax.inject。之后,我什么也得不到,因为inject文件夹是空的。我试过重建和清洁他的项目。我也尝试过使缓存无效,但似乎没有任何效果。我怎么才能让这起作用? 依赖项列表 刀柄版本-2.37

  • 我是一个新的Spring,并在某些方面被卡住了,如下所述- 我有一个类color,它有两个不同的实现名,分别是Red和Blue,我想使用将这两个实现名都注入color列表中。 但将异常获取为 自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.beanCreationException:无法自动连接字段:private java.util.lis

  • 我已经通过->->创建了新项目 我的第一个问题是:为什么@inject注释显示错误?即使添加了。

  • 这篇文章是applicationcontext.xml中bean声明的连续性 我有一个使用Spring3和Hibernate4以及JSF2的小应用程序,当我运行我得到的应用程序时。 ManagedBean: 并且我有注入注释: 在EmployeeService中,我有如下注释: 更新2 ApplicationContext.xml:

  • 我有一把刀: 问题是,当我试图使用DAO进行加载调用时,使用DynamoDBMapper以field d1作为哈希键来获取项目,它会抛出一个DynamoDBExc0019,说:为公共DAO. getField2()找到了空键,但实际上表的值对应于field d2。问题,这是因为Lombok注释而不是手动突变代码,还是一般来说我们一起使用Lombok和DynamoDBAnnotions?