java.lang.NullPointerException
at com.pengyou.service.impl.delServiceImpl.delreg(delServiceImpl.java:23)
...
錯誤明確指向 delServiceImpl.java 第 23 行發生空指標異常,經分析該行為 deldao.delreg(id);,表明 deldao 依賴注入失敗,為 null。
@Repository("deldao")
public class delDaoImpl implements IdelDao {
@Resource
protected SessionFactory sessionFactory;
// ...
@Override
public void delreg(int id) {
Session session = this.getSession();
registryEntity regens = new registryEntity();
regens.setId(id);
session.delete(regens);
}
}
@Service("delservice")
public class delServiceImpl implements IdelService {
private IdelDao deldao; // 缺少 @Resource 或 @Autowired 註解!
@Override
public void delreg(int id) {
System.out.println("delServiceImpl---1------>" + id);
deldao.delreg(id); // 第23行:deldao 為 null
System.out.println("delServiceImpl--------->" + id);
}
}
@Controller
@RequestMapping("/del/")
public class delController extends BaseController {
@Resource
private IdelService idelservice;
// ...
}
在 delServiceImpl 中為 deldao 欄位加入依賴注入註解:
@Service("delservice")
public class delServiceImpl implements IdelService {
@Resource // 或 @Autowired
private IdelDao deldao; // 修復:注入 DAO 依賴
@Override
@Transactional // 建議在方法層級加上事務註解
public void delreg(int id) {
System.out.println("delServiceImpl---1------>" + id);
deldao.delreg(id);
System.out.println("delServiceImpl--------->" + id);
}
}
原始碼中 session.delete(regens) 使用新建實體刪除,雖可行但不符合 Hibernate 最佳實踐。建議改為:
@Override
public void delreg(int id) {
Session session = this.getSession();
registryEntity regens = (registryEntity) session.get(registryEntity.class, id);
if (regens != null) {
session.delete(regens);
}
}
此寫法先載入持久化物件再刪除,可觸發攔截器、級聯刪除等機制,且能避免刪除不存在實體拋出異常。
IdelDao 介面與 delDaoImpl 實作類的 bean 名稱一致(@Repository("deldao"))com.pengyou.dao.impl 與 com.pengyou.service.impl 套件sessionFactory bean 正確注入 DAO 層id 參數null