Bom, estou trabalhando com Spring para injeção de dependência e ele funciona normalmente apenas para 2 classes: BasicBOImpl e BasicDAOImpl. Qualquer outra que eu crie (mesmo que faça igualzinho, os beans ficam como null). Criei a classe abaixo e o atributo dao sempre fica null trazendo um NullPointerException:
package br.com.odontonew.helper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import br.com.odontonew.bean.Lov;
import br.com.odontonew.dao.BasicDAO;
@Component
public class LovHelper {
@Autowired
private BasicDAO dao;
private static LovHelper instance;
private LovHelper(){
}
public static LovHelper getInstance(){
if (instance == null)
instance = new LovHelper();
return instance;
}
public Lov getLovByCodigo(Class lovClass, String codigo){
Map<String,Object> map = new HashMap<String,Object>();
map.put("codigo", codigo);
List<Lov> lovs = (List<Lov>)dao.findByQuery("SELECT c FROM "+lovClass.getName()+" c WHERE c.codigo = :codigo", map);
if (lovs.size() == 1)
return lovs.get(0);
else
return null;
}
/*Getters and Setters*/
public BasicDAO getDao() {
return dao;
}
public void setDao(BasicDAO dao) {
this.dao = dao;
}
}
Segue meu BasicDAOImpl, pois o BasicDAO é só a interface:
package br.com.odontonew.dao;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
import org.primefaces.component.log.Log;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import br.com.odontonew.bean.AbstractBean;
import br.com.odontonew.exception.BOException;
@Repository("basicDAO")
public class BasicDAOImpl implements BasicDAO {
@PersistenceContext
protected EntityManager entityManager;
private Logger logger = Logger.getLogger(BasicDAOImpl.class);
@Transactional(readOnly = true)
public List<? extends AbstractBean> findByNamedQuery(String namedQuery,
Map<String, Object> namedParams) {
try {
if (logger.isDebugEnabled())
logger.debug("Procurando pela namedQuery " + namedQuery
+ " com " + namedParams.size() + " parametros");
Query query = entityManager.createNamedQuery(namedQuery);
if (namedParams != null) {
Iterator it = namedParams.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> mapEntry = (Map.Entry<String, Object>) it
.next();
query.setParameter(mapEntry.getKey(), mapEntry.getValue());
}
}
return query.getResultList();
} catch (Exception e) {
e.printStackTrace();
logger.error("Ocorreu um erro ao procurar por uma Named Query. MSG ORIGINAL: "
+ e.getMessage());
throw new BOException(
"Ocorreu um erro ao procurar por uma Named Query");
}
}
@Transactional(readOnly = true)
public List<? extends AbstractBean> findByNamedQuery(String namedQuery) {
try {
if (logger.isDebugEnabled())
logger.debug("Procurando pela namedQuery " + namedQuery
+ " sem nenhum parametro");
Query query = entityManager.createNamedQuery(namedQuery);
return query.getResultList();
} catch (Exception e) {
e.printStackTrace();
logger.error("Ocorreu um erro ao procurar por uma Named Query. MSG ORIGINAL: "
+ e.getMessage());
throw new BOException(
"Ocorreu um erro ao procurar por uma Named Query");
}
}
@Transactional(readOnly = true)
public List<? extends AbstractBean> findByQuery(String hql, Map<String, Object> namedParams) {
try {
if (logger.isDebugEnabled())
logger.debug("Procurando pela query: " + hql);
Query query = entityManager.createQuery(hql);
if (namedParams != null) {
Iterator it = namedParams.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> mapEntry = (Map.Entry<String, Object>) it
.next();
query.setParameter(mapEntry.getKey(), mapEntry.getValue());
}
}
return query.getResultList();
} catch (Exception e) {
e.printStackTrace();
logger.error("Ocorreu um erro ao procurar por uma Query. MSG ORIGINAL: "
+ e.getMessage());
throw new BOException(
"Ocorreu um erro ao procurar por uma Query");
}
}
@Transactional
public AbstractBean save(AbstractBean bean) {
try {
if (logger.isDebugEnabled())
logger.debug("Salvando Bean " + bean.getClass().getName());
entityManager.persist(bean);
return bean;
} catch (Exception e) {
e.printStackTrace();
logger.error("Ocorreu um erro ao procurar por uma Named Query. MSG ORIGINAL: "
+ e.getMessage());
throw new BOException(
"Ocorreu um erro ao procurar por uma Named Query");
}
}
@Transactional
public void update(AbstractBean bean) {
try {
if (logger.isDebugEnabled())
logger.debug("Alterando Bean " + bean.getClass().getName());
entityManager.merge(bean);
} catch (Exception e) {
e.printStackTrace();
logger.error("Ocorreu um erro ao procurar por uma Named Query. MSG ORIGINAL: "
+ e.getMessage());
throw new BOException(
"Ocorreu um erro ao procurar por uma Named Query");
}
}
@Transactional
public void delete(AbstractBean bean) {
try {
if (logger.isDebugEnabled())
logger.debug("Deletando Bean " + bean.getClass().getName());
entityManager.remove(bean);
} catch (Exception e) {
e.printStackTrace();
logger.error("Ocorreu um erro ao procurar por uma Named Query. MSG ORIGINAL: "
+ e.getMessage());
throw new BOException(
"Ocorreu um erro ao procurar por uma Named Query");
}
}
/* Spring Definition */
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}