我使用JBoss教程和应用程序结构开发了一个TicketMonster社交网络web应用程序;我的设计涉及不同类型的帐户特权,许多服务需要检查登录用户的用户帐户详细信息以及他们希望查看/访问的其他数据。
例如。版主可以查看禁用的帐户和评论,而成员则不能。
对于上面的示例,我使用的方法是创建一个查询,该查询使用用户名:Query query = entityManager.createQuery("select u from User u where u.username in :userName", User.class);     query.setParameter("userName", username);     User user = (User) query.getSingleResult();     return user;检索用户
由于不同的服务都使用该方法,所以我认为在ServicesUtility类中使用该方法是个好主意,它在构造函数中使用EntityManager,并对其执行查询并返回值。问题是ServiceUtility类中的实体管理器不接受传递的entityManager,并且仍然为空。相同的方法在服务中工作,我对此很满意,并且不介意将它添加到BaseEntityService父类中,但我只是想知道为什么它不能工作。
更新:下面是我的ServiceUtility类的代码:
`
public class ServiceUtility {
// @Inject
EntityManager em;
public ServiceUtility(EntityManager entityManager){
    em = entityManager;
}
public User getUserFromUsername(String username){
    try{
        Query query = em.createQuery("select u from User u where u.username in :userName", User.class);
        query.setParameter("userName", username);
        User user = (User) query.getSingleResult();
        return user;
    } catch(Exception e) { //null, no results, constraints violation, exception (all types) - Note: must differentiate between types.
        return null;            
    }
}
public Thread getThreadFromTitle(String title){
    Query query = em.createQuery("select t from Thread t where t.title = :Title");
    query.setParameter("Title", title);
    return (Thread) query.getSingleResult();
}
public Thread getThreadFromId(Long id){
    Query query = em.createQuery("select t from Thread t where t.id = :Id");
    query.setParameter("Id", id);
    return (Thread) query.getSingleResult();
}
public Response badRequestResponse(String message){
    Map<String, Object> responseEntity = new HashMap<String, Object>();
    responseEntity.put("errors", Collections.singletonList(message));
    return Response.status(Response.Status.BAD_REQUEST).entity(responseEntity).build();
}
}`
更新:
尽管我仍然对这个问题的解决方案非常感兴趣,但我解决了这个问题,不再需要需要ServiceUtility中实体管理器的方法,并将其更改为getSingleInstance:
`
@GET
@Path("/{id:[0-9][0-9]*}")
@Produces(MediaType.APPLICATION_JSON)
public T getSingleInstance(@PathParam("id") Long id) {
    return getSingleInstance(entityClass, id);
}
public <X> X getSingleInstance(Class<X> type, Long id){
    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<X> criteriaQuery = criteriaBuilder.createQuery(type);
    Root<X> root = criteriaQuery.from(type);
    Predicate condition = criteriaBuilder.equal(root.get("id"), id);
    criteriaQuery.select(criteriaQuery.getSelection()).where(condition);
    return entityManager.createQuery(criteriaQuery).getSingleResult();
}`
发布于 2015-04-15 05:35:42
最好使用依赖注入- @Inject (首选)或@PersistenceContext,将EntityManager依赖注入到ServicesUtility中。在Java中,构造函数注入器并不比字段注入更受欢迎/不受支持,因此使用字段注入是有意义的。
只要bean ServicesUtility的生命周期由容器(CDI容器或其他容器)管理,在典型的方法调用期间,它中的EntityManager字段就不会为null。
有一个CDI生成器方法。 in TicketMonster,它演示了如何编写生产者方法来生成EntityManager。CDI容器将使用这个生产者将EntityManager注入到开发人员(您)声明的任何想要的注入点;例如,参考文献。
https://stackoverflow.com/questions/29619574
复制相似问题