Como injetar o meu DAO no meu EJB?

10 respostas
F

Pessoal segue minha arquitetura:

[img]https://www.filepicker.io/api/file/tUMhw14dSbiLa2g4KeSZ[/img]

projetos no Eclipse:

[img]http://s23.postimg.org/pjc75dfjd/img.jpg[/img]

setup:

Java 7
JBoss AS 7

Agora o problema:

Eu tenho o seguinte EJB/WebService

@Stateless
@WebService
public class PessoaFisicaWS implements Service {

	@EJB
	private PessoaFisicaDAO dao;

	@WebMethod(operationName = "adicionarFisica")
	public boolean addPessoaFisica(@WebParam(name = "nome") String nome,
			@WebParam(name = "cpf") String cpf,
			@WebParam(name = "conjugue") String nomeConjugue,
			@WebParam(name = "pai") String nomePai,
			@WebParam(name = "mae") String nomeMae,
			@WebParam(name = "rg") String numeroRegistroGeral) {
		try {
			PessoaFisicaBean fisica = new PessoaFisicaBean();
			fisica.setNome(nome);
			fisica.setCpf(cpf);
			fisica.setNomeConjugue(nomeConjugue);
			fisica.setNomePai(nomePai);
			fisica.setNomeMae(nomeMae);
			fisica.setNumeroRegistroGeral(numeroRegistroGeral);
			dao.add(fisica);

			System.out.println("RENAN FALOU!");
			return true;
		} catch (Exception exception) {
			return false;
		}
	}

	@WebMethod(operationName = "removerFisica")
	public boolean removePessoaFisica(@WebParam(name = "cpf") String cpf) {
		try {
			PessoaFisicaBean bean = getPessoa(cpf);
			dao.delete(bean);
			return true;
		} catch (Exception exception) {
			return false;
		}
	}

	private PessoaFisicaBean getPessoa(String cpf) throws Exception {
		return dao.getPessoaFisicaByCPF(cpf);
	}

	@WebMethod(operationName = "atualizarFisica")
	public boolean updatePessoaFisica(@WebParam(name = "nome") String nome,
			@WebParam(name = "cpf") String cpf,
			@WebParam(name = "conjugue") String nomeConjugue,
			@WebParam(name = "pai") String nomePai,
			@WebParam(name = "mae") String nomeMae,
			@WebParam(name = "rg") String numeroRegistroGeral) {
		try {
			PessoaFisicaBean fisica = findPessoaFisica(cpf);
			fisica.setNome(nome);
			fisica.setCpf(cpf);
			fisica.setNomeConjugue(nomeConjugue);
			fisica.setNomePai(nomePai);
			fisica.setNomeMae(nomeMae);
			fisica.setNumeroRegistroGeral(numeroRegistroGeral);

			dao.update(fisica);

			return true;
		} catch (Exception exception) {
			return false;
		}
	}

	@WebMethod(operationName = "procurarFisica")
	public PessoaFisicaBean findPessoaFisica(@WebParam(name = "cpf") String cpf) {
		try {
			PessoaBean bean = getPessoa(cpf);
			PessoaFisicaBean fisica = dao.get(bean.getId());
			return fisica;
		} catch (Exception exception) {
			return null;
		}
	}

	@Override
	@WebMethod(operationName = "getPessoasFisica")
	public List<PessoaFisicaBean> getListOfPessoaFisica() {
		return dao.getAll();
	}
}

e agora minha camada de persistencia (tudo isso aqui ta no projeto JPA.

public interface DAO<T> {

	public void delete(T t) throws Exception;
	public void update(T t) throws Exception;
	public void add(T t) throws Exception;
	
	public void refresh(T t);
	
	public T get(Long id) throws Exception;
	
	public void deleteById(Long id) throws Exception;
	public void createOrUpdate(T t);
	
	public List<T> getAll();

}
public interface PessoaFisicaDAO extends DAO<PessoaFisicaBean> {

	public PessoaFisicaBean getPessoaFisicaByCPF(String cpf);

}

implemetacões:

public abstract class JPAAbstractDAO<T> implements DAO<T> {

	@PersistenceContext
	protected EntityManager manager;

	@Override
	public void delete(T t) throws Exception {
		manager.remove(t);
	}

	@Override
	public void add(T t) throws Exception {
		manager.persist(t);
	}

	@Override
	public void update(T t) throws Exception {
		manager.merge(t);
	}
	
	@Override
	public void refresh(T t) {
		manager.refresh(t);
	}

}
@Stateless
public class JPAPessoaFisicaDAO extends JPAAbstractDAO<PessoaFisicaBean>
		implements PessoaFisicaDAO {

	public PessoaFisicaBean getPessoaFisicaByCPF(String cpf) {
		TypedQuery<PessoaFisicaBean> query = manager.createQuery(
				"SELECT p from PessoaFisicaBean p where p.cpf = :cpf",
				PessoaFisicaBean.class);
		query.setParameter("cpf", cpf);

		return query.getSingleResult();
	}

	@Override
	public PessoaFisicaBean get(Long id) throws Exception {
		return manager.find(PessoaFisicaBean.class, id);
	}

	@Override
	public List<PessoaFisicaBean> getAll() {
		List<PessoaFisicaBean> results = manager.createQuery(
				"SELECT p from " + PessoaFisicaBean.class.getSimpleName()
						+ " p").getResultList();
		return results;
	}

	@Override
	public void deleteById(Long id) throws Exception {
		PessoaFisicaBean t = get(id);
		manager.remove(t);
	}

	@Override
	public void createOrUpdate(PessoaFisicaBean t) {
		PessoaFisicaBean bean = getPessoaFisicaByCPF(t.getCpf());

		if (bean != null) {
			manager.merge(t);
		} else {
			manager.persist(t);
		}
	}

}

Tudo isso vai empacotado num EAR. E quando eu vou fazer o deploy no JBoss o seguinte erro aparece:

15:46:44,951 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC00001: Failed to start service jboss.deployment.subunit."projectoEAR.ear"."processoEJB.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.subunit."projectoEAR.ear"."processoEJB.jar".INSTALL: Failed to process phase INSTALL of subdeployment "processoEJB.jar" of deployment "projectoEAR.ear" at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:119) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final] at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA] at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_21] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_21] at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_21] Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011058: Failed to install component PessoaFisicaWS at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:100) at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final] ... 5 more Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS014544: No EJB found with interface of type 'br.com.processo.dao.PessoaFisicaDAO' for binding pacote.PessoaFisicaWS/dao at org.jboss.as.ejb3.deployment.processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:88) at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.processBindings(ComponentInstallProcessor.java:245) at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.access$000(ComponentInstallProcessor.java:74) at org.jboss.as.ee.component.deployers.ComponentInstallProcessor$1.handle(ComponentInstallProcessor.java:199) at org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54) at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deployComponent(ComponentInstallProcessor.java:195) at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:93) ... 6 more

10 Respostas

R

Só uma dúvida, já tentou anotar a interface com @Local?

F

qual interface? (DAO / DAOPessoaFisica)?

R

A que você quer injetar

F
Rodrigo Sasaki:
A que você quer injetar

fiz isso:

@Local
public interface PessoaFisicaDAO extends DAO<PessoaFisicaBean> {

	public PessoaFisicaBean getPessoaFisicaByCPF(String cpf);

}

mas o erro persiste.. (ate pq quando nao se marca a classe com @Local ele ja é marcado por default)

-------

Será que isso se deve ao fato de que os DAO's e suas implementações estão num outro projeto? (JPA) e o meu web service num EJB Project? [estao empacotados num EAR]

R

está tudo empacotado no mesmo EAR?

R

Não tinha visto seu edit. Se as coisas estão em pacotes diferentes, você tem que fazer um lookup remoto

F

sim… porém. Eu fiz o teste aqui e é exatamente isso:

rafael@rafael-note:~/workspace-pje$ tree
.
├── processoEJB
│ ├── build
│ │ └── classes
│ │ ├── META-INF
│ │ │ ├── ejb-jar.xml
│ │ │ └── MANIFEST.MF
│ │ └── pacote
│ │ ├── DAO.class
│ │ ├── JPAAbstractDAO.class
│ │ ├── JPAPessoaFisicaDAO.class
│ │ ├── PessoaFisicaDAO.class
│ │ ├── PessoaFisicaWS.class [WEB-SERVICE AQUI | EU UTILIZEI OS DAO’S DO MESMO PACOTE E FUNCIONOU… MAS QUANDO USO OS DEBAIXO, NAO FUNCIONA ]
│ │ └── Service.class
│ └── Modules
│ ├── META-INF
│ │ ├── ejb-jar.xml
│ │ └── MANIFEST.MF
│ └── pacote
│ ├── DAO.java
│ ├── JPAAbstractDAO.java
│ ├── JPAPessoaFisicaDAO.java
│ ├── PessoaFisicaDAO.java
│ ├── PessoaFisicaWS.java
│ └── Service.java
└── processoJPA
├── build
│ └── classes
│ ├── br
│ │ └── com
│ │ └── processo
│ │ ├── bean
│ │ │ ├── CidadeBean.class
│ │ │ ├── EscolaridadeBean.class
│ │ │ ├── EstadoBean.class
│ │ │ ├── EstadoCivilBean.class
│ │ │ ├── PessoaBean.class
│ │ │ ├── PessoaFisicaBean.class
│ │ │ ├── PessoaJuridicaBean.class
│ │ │ ├── ProfissaoBean.class
│ │ │ ├── SexoBean.class
│ │ │ └── TipoPessoaBean.class
│ │ └── dao [ QUANDO USO OS DAO’S desse pacote aqui nao funciona ]
│ │ ├── DAO.class
│ │ ├── JPAAbstractDAO.class
│ │ ├── JPAPessoaFisicaDAO.class
│ │ └── PessoaFisicaDAO.class
│ └── META-INF
│ ├── MANIFEST.MF
│ └── persistence.xml
└── src
├── br
│ └── com
│ └── processo
│ ├── bean
│ │ ├── CidadeBean.java
│ │ ├── EscolaridadeBean.java
│ │ ├── EstadoBean.java
│ │ ├── EstadoCivilBean.java
│ │ ├── PessoaBean.java
│ │ ├── PessoaFisicaBean.java
│ │ ├── PessoaJuridicaBean.java
│ │ ├── ProfissaoBean.java
│ │ ├── SexoBean.java
│ │ └── TipoPessoaBean.java
│ └── dao
│ ├── DAO.java
│ ├── JPAAbstractDAO.java
│ ├── JPAPessoaFisicaDAO.java
│ └── PessoaFisicaDAO.java
└── META-INF
├── MANIFEST.MF
└── persistence.xml

24 directories, 48 files

F

mesmo estando no mesmo EAR? :expressionless:

R

Agora não lembro exatamente aonde é dividido isso, eu achava que era por EAR, mas eu testaria :slight_smile:

F

To o dia inteiro nisso… e nao consigo resolver :expressionless:
Pior que tem que ficar dividido

Criado 31 de outubro de 2013
Ultima resposta 31 de out. de 2013
Respostas 10
Participantes 2