首页 > 解决方案 > @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”。

休眠肯定有效......所以问题不存在。这是我第一次尝试使用依赖注入,但我不确定我做错了什么。

谢谢

标签: javajakarta-eedependency-injection

解决方案


您不能注入 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;

推荐阅读