为什么 DAO 通过@EJB注释变得空



我正在用Jax-rs服务器实现数据源,我已经面临很多问题,我通过搜索解决了,其他通过推断解决了,现在我找到了一个我无法解决的问题。

10:31:23,633 信息 [org.jboss.as.ejb3.deployment] (MSC 服务线程 1-5) WFLYEJB0473:名为会话 Bean 的 JNDI 绑定 部署单位中的"NotificacaoDAOEJB"部署"SouVizinho.war" 具体如下:

java:global/SouVizinho/NotificacaoDAOEJB!br.com.br.ejb.NotificacaoDAOEJB java:app/SouVizinho/NotificacaoDAOEJB!br.com.br.ejb.NotificacaoDAOEJB java:module/NotificacaoDAOEJB!br.com.br.ejb.NotificacaoDAOEJB java:global/SouVizinho/NotificacaoDAOEJB java:app/SouVizinho/NotificacaoDAOEJB java:module/NotificacaoDAOEJB

10:31:23,634 信息 [org.jboss.as.ejb3.deployment] (MSC 服务线程 1-5) WFLYEJB0473:名为会话 Bean 的 JNDI 绑定 部署单元"部署"中的"NotificacaoControladorEJB" "SouVizinho.war"如下:

java:global/SouVizinho/NotificacaoControladorEJB!br.com.souvizinho.controlador.NotificacaoControladorEJB java:app/SouVizinho/NotificacaoControladorEJB!br.com.souvizinho.controlador.NotificacaoControladorEJB java:module/NotificacaoControladorEJB!br.com.souvizinho.controlador.NotificacaoControladorEJB java:global/SouVizinho/NotificacaoControladorEJB java:app/SouVizinho/NotificacaoControladorEJB java:module/NotificacaoControladorEJB

我正在通过PostMan请求"/contador/{id}",当它到达notificaoDAO.contador(id)时,它说notificacaoDAO

PS:我在Eclipse Oxygen上使用Wildfly 11

控制器

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@Path("ejb/notificacao")
@Stateless
@LocalBean
public class NotificacaoControladorEJB {

SmartJava smartjava = new SmartJava();
@EJB
NotificacaoDAOEJB notificacaoDAO;

@GET
@Produces("application/json; charset=UTF-8")
@Path("/contador/{id}")
public Notificacao contadorGet(@PathParam("id") int id) {
long quantidade;
try {
quantidade = notificacaoDAO.contador(id);
return new Notificacao(quantidade);
} catch(Exception e) {
quantidade = 0;
System.err.println(smartjava.getFullStackTrace(e));
return new Notificacao(quantidade);
}
}

import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
@LocalBean
public class NotificacaoDAOEJB {
//private EntityManagerFactory entityManagerFactory;
@PersistenceContext
private EntityManager entityManager;
SmartJava sj = new SmartJava();

public Notificacao Salvar(Notificacao notificacao) {
try {
this.entityManager.getTransaction().begin();
this.entityManager.persist(notificacao);
this.entityManager.getTransaction().commit();
} catch (Exception e) {
System.out.println(sj.getFullStackTrace(e));
} finally {
//this.entityManager.close();
}
return notificacao;
}
public void Alterar(Notificacao notificacao){
this.entityManager.getTransaction().begin();
this.entityManager.merge(notificacao);
this.entityManager.getTransaction().commit();
//this.entityManager.close();
}
@SuppressWarnings("unchecked")
public List<Notificacao> Listar(){
return this.entityManager.createQuery("SELECT a FROM Notificacao a ORDER BY a.dtcad").getResultList();
}
public Notificacao GetNotificacao(int nrseq) {
return this.entityManager.find(Notificacao.class, nrseq);
}
@SuppressWarnings("unchecked")
public long contador(int nrsequsuario) {
try {
return (long) this.entityManager.createQuery("SELECT COUNT(a) FROM Notificacao a "
+ "WHERE a.visualizado = false AND a.useralvo.nrseq = :usuario ORDER BY a.dtcad")
.setParameter("usuario", nrsequsuario).getSingleResult();
} catch(Exception e) {
System.err.println(sj.getFullStackTrace(e));
return 0;
}
} 
}

我遵循了本教程:

https://blogs.sap.com/2014/11/26/jax-rs-the-missing-link-between-ui5-and-hcp-java-apps-adding-ejb/

并且工作了,但是我在事务方面遇到问题,所以我做了本主题的用户事务: JTA EntityManager 不能使用 getTransaction()

现在一切正常,持续 100 毫秒而不是 5000 毫秒,并列出 50 毫秒而不是 3000 毫秒。

最新更新