为了账号安全,请及时绑定邮箱和手机立即绑定

@Inject 在 java EE 中给出 NullPointer 异常

@Inject 在 java EE 中给出 NullPointer 异常

莫回无 2022-05-25 17:45:10
我正在尝试创建一个 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”。休眠肯定有效......所以问题不存在。这是我第一次尝试使用依赖注入,但我不确定我做错了什么。谢谢
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

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


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信