java - @Inject 在 java EE 中给出 NullPointer 异常
问题描述
我正在尝试创建一个 Web 服务,该服务提供一些通过休眠从数据库中获取的结果。
@Path("/book")
public class BookService {
@Inject
private dbController db;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getBookTitle() {
return "H2G2";
}
@GET
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
public Response getUsers(){
List<UserEntity> users = db.getUsers();
return Response.ok(users,MediaType.APPLICATION_JSON).build();
}
}
每当我调用http://localhost/book/users时,db 变量始终为空。
dbController 是:
public class dbController {
@Inject
private HibernateUtil util;
public List<UserEntity> getUsers(){
List<UserEntity> result = null;
try{
result = (List<UserEntity>) this.util.createQuery("select e from UserEntity e");
}catch (Exception e){
System.out.println(e.getMessage());
}
return result;
}
}
HibernateUtil 是:
public class HibernateUtil {
private static final EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("NewPersistenceUnit");
private EntityManager entityManager = null;
private void createEntityManager(){
if (this.entityManager==null){
this.entityManager = entityManagerFactory.createEntityManager(); // here is your persistence unit name
}
}
private void closeConnection(){
this.entityManager.close();
this.entityManager = null;
}
public List createQuery(String query) throws Exception{
this.createEntityManager();
List result;
try{
result = this.entityManager.createQuery(query).getResultList();
}catch (Exception e){
throw new Exception(e.getMessage());
}
return result;
}
}
我正在使用 intellij,并在 db.getUsers() 处添加了一个断点,并通过添加新的 dbController() 来设置变量 db。但是,Intellij 给了我错误“未加载类:controller.dbController”。
休眠肯定有效......所以问题不存在。这是我第一次尝试使用依赖注入,但我不确定我做错了什么。
谢谢
解决方案
您不能注入 POJO,它必须是 Bean。因此,使其成为 bean 需要注释,例如:
@Stateful
@LocalBean
public class dbController {..} // Should be DbController, start with CAPS
和
@Stateful // or maybe @Stateless ?
@LocalBean
public class HibernateUtil {..}
然后,当您有一个 Bean 时,它是不允许使用的static final
,因此需要进行如下更改:
private EntityManagerFactory entityManagerFactory =
Persistence.createEntityManagerFactory("NewPersistenceUnit");
但实际上最简单的获取EntityManager
方法就是也注入它。喜欢:
@PersistenceContext// maybe also with unit name (unitName = "whatever_the_unit_name_is")
private EntityManager em;
推荐阅读
- sql - 日期时间字符串必须匹配 ISO 8601 格式 - 在 azure 数据工厂管道 - 随机出错
- nativescript - How do I import the javascript for a custom theme?
- apache-spark - Spark AR Studio how to move object after 3 seconds patch editor
- php - php Page didn't send JSON response
- php - 调用文件,如果网络服务这样取消调用
- raml - resourceType 如何从多种类型继承?
- go - 如何在 go 中使用字符串文字
- jquery - use tempus dominus datetimepicker with CLASS instead of ID and for multiple instances
- java - File not saved on real device
- node.js - 403 "Insufficient authentication scopes" with Google Sheets API and Service Account