Como injetar o meu DAO no meu EJB?

Pessoal segue minha arquitetura:

projetos no Eclipse:

setup:

Java 7
JBoss AS 7

Agora o problema:

Eu tenho o seguinte EJB/WebService

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

}[/code]

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

[code]public interface DAO {

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

}[/code]

[code]public interface PessoaFisicaDAO extends DAO {

public PessoaFisicaBean getPessoaFisicaByCPF(String cpf);

}[/code]

implemetacões:

[code]public abstract class JPAAbstractDAO implements DAO {

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

}[/code]

[code]@Stateless
public class JPAPessoaFisicaDAO extends JPAAbstractDAO
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);
	}
}

}[/code]

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

[quote]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[/quote]

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

qual interface? (DAO / DAOPessoaFisica)?

A que você quer injetar

fiz isso:

[code]
@Local
public interface PessoaFisicaDAO extends DAO {

public PessoaFisicaBean getPessoaFisicaByCPF(String cpf);

}[/code]

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]

está tudo empacotado no mesmo EAR?

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

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

mesmo estando no mesmo EAR? :expressionless:

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

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