繁体   English   中英

JBoss Web应用程序-将entitymanager作为参数传递不起作用

[英]JBoss web application - passing the entitymanager as an argument doesn't work

我使用TicketMonster教程和应用程序结构开发了JBoss社交网络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; 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,并且保持为空。 相同的方法在Services中也可以使用,我很满意,并且不介意将其添加到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();
}
}

`

更新:

尽管我对解决该问题仍然非常感兴趣,但是通过将对getSingleInstance的更改更改为不需要ServiceUtility中的实体管理器的方法,我解决了该问题:

`

@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();
}

`

最好使用依赖项注入-@ @Inject (首选)或@PersistenceContext将EntityManager依赖项注入ServicesUtility 在Java EE中,与字段注入相比,构造器注入器不是首选/不受支持的,因此使用字段注入是有意义的。

只要bean ServicesUtility的生命周期是由容器(CDI容器或其他容器)管理的,那么在典型方法调用期间,其中的EntityManager字段就不会为null。

TicketMonster中有一个CDI生产者方法 ,该方法演示了如何编写生产者方法以产生EntityManager CDI容器将使用此生产者将EntityManager注入到开发者(您)声明的任何所需注入点中; 例如, 这是BaseEntityService接收其EntityManager参考的方式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM