JBoss Web 应用程序 - 将实体管理器作为参数传递不起作用



我使用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;

由于不同的服务使用该方法,我认为将其放在ServicesUtility类中是一个好主意,该类在其构造函数中接受EntityManager,并对其执行查询并返回值。问题是ServiceUtility类中的实体管理器不接受传递的entityManager,并且保持为null。同样的方法也适用于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中需要entitymanager的方法的需求,从而解决了这个问题

`

@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中。在JavaEE中,与字段注入相比,构造函数注入不是首选的/不受支持的,因此使用字段注入是有意义的。

只要beanServicesUtility的生命周期由容器(CDI容器或其他容器)管理,在典型的方法调用过程中,其中的EntityManager字段就不会为空。

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

最新更新