【发布时间】:2020-09-21 20:52:10
【问题描述】:
我知道以前在这里被问过很多次类似的问题,但我仍然对这些机制感到困惑。
这是我的问题。来自CategoryService 中的CategoryDAO 对象的空指针异常。
@Service
public class CategoryService {
@Autowired
private CategoryDAO categoryDAO;
public List<Category> list(){
List<Category> categories = categoryDAO.list();
for (Category category : categories){
List<Record> rs = recordDAO.list(category.getID());
category.setRecordNumber(rs.size());
}
return categories;
}
public void add(String name){
Category newCategory = new Category();
newCategory.setName(name);
categoryDAO.add(newCategory);
}
}
@Repository
public class CategoryDAO {
@Autowired
private SqlSessionFactory sqlSessionFactory;
public int getTotal(){
SqlSession sqlSession = sqlSessionFactory.openSession();
List<Category> categories = sqlSession.selectList("category.selectAll");
return categories.size();
}
}
在这个top rated post 和this one 中,两个最热门的答案都提到了The most preferable option is to let Spring autowire all of your beans。
这是否意味着一旦我需要它,我还必须在其他类中自动连接CategoryService?这意味着我不能使用new 运算符来初始化一个包含自动装配对象的类?
如果是,请您解释一下背后的原因吗?
谢谢
更新
这是一个关于使用自动装配类CategoryService的示例:
public class RecordListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
RecordPanel panel = RecordPanel.getInstance();
if (new CategoryService().list().size() == 0){
JOptionPane.showMessageDialog(panel, "NO category is recorded, set category first");
MainPanel.getInstance().getPanel().display(CategoryPanel.getInstance());
return;
}
}
CategoryService 用于new CategoryService().list().size() == 0。如果我在这里将它自动装配为此类的一个属性,那么一旦我需要它,这个类也需要注入。我想避免这种情况,这样事情会更容易。我怎样才能做到这一点?
【问题讨论】:
-
能否提供上面提到的 NullPointer 异常的堆栈跟踪
-
@RahalKanishka 很抱歉没有第一时间提供。但是我已经按照公认的答案解决了它,现在无法获得堆栈跟踪。这只是一个基本的 NullPointer 异常,由
List<Category> categories = categoryDAO.list()在CategoryService类中引发。