[RESOLVIDO] Como injetar um EntityManager em um Validator no JSF?

3 respostas
javer

Pessoal,

Preciso usar um EntityManager dentro de um Validator no JSF (Primefaces) para quando o usuário informar um CNPJ para um cadastro ele faça uma consulta no banco e veja se o CNPJ existe.

O que acontece é que não consigo injetar o EntityManager nesse Validator, sempre fica null.

@FacesValidator("cnpjValidator")
public class ValidadorCNPJ implements Validator {

	@PersistenceContext(unitName = "appCDIUnit")
	private EntityManager em;

	private UtilCNPJ utilCNPJ;

	public ValidadorCNPJ() {
		utilCNPJ = new UtilCNPJ();
	}

	public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
		String strValue = (String) value;

		String strValueTemp = strValue;
		strValueTemp = strValueTemp.replace("_", "");
		strValueTemp = strValueTemp.replace(".", "");
		strValueTemp = strValueTemp.replace("/", "");
		strValueTemp = strValueTemp.replace("-", "");
		strValueTemp = strValueTemp.trim();

		if (!utilCNPJ.validarCNPJ(strValueTemp)) {
			FacesMessage message = new FacesMessage();
			message.setDetail("CNPJ inválido");
			message.setSummary("CNPJ inválido");
			message.setSeverity(FacesMessage.SEVERITY_ERROR);
			throw new ValidatorException(message);
		}

		// verificar se o CNPJ já está cadastrado.
		String tabela = (String) component.getAttributes().get("tabela");
		String coluna = (String) component.getAttributes().get("coluna");
		boolean cnpjCadastrado = false;
		try {
			// aqui o "em" está sempre null porque não injeta
			Query query = em.createNativeQuery("SELECT :coluna FROM :tabela WHERE :coluna = :valor");
			query.setParameter("coluna", coluna);
			query.setParameter("tabela", tabela);
			query.setParameter("valor", strValueTemp);
			Object objCnpj = query.getSingleResult();

		} catch (Exception ex) {
			ex.printStackTrace();
			FacesMessage message = new FacesMessage();
			message.setDetail("CNPJ inválido");
			message.setSummary(ex.getMessage());
			message.setSeverity(FacesMessage.SEVERITY_ERROR);
			throw new ValidatorException(message);
		}
	}
}
Sendo que nos meus EJBs eu injeto normalmente:
@Stateless
public class RemetenteServiceEJB extends AbstractPersistence<Remetente, Long> implements RemetenteService {

	@PersistenceContext(unitName = "appCDIUnit")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
...
Mesmo eu anotando assim, continua não injetando:
@Stateless
@FacesValidator("cnpjValidator")
public class ValidadorCNPJ implements Validator {
...
====== S O L U Ç Ã O ==================================================================== Bom, para conseguir injetar em um Validator é necessário que ele seja tratado como um Manged Bean normal, ou seja:
@ManagedBean
@RequestScoped
public class ValidadorCNPJ implements Validator, Serializable {

	private static final long serialVersionUID = -431497045485894897L;

	@PersistenceContext(unitName = "appCDIUnit")
	private EntityManager em;
...
Nas paginas xhtml deve ser chamando na propriedade binding do componente:
<f:validator binding="#{validadorCNPJ}" />
[color=green]Fica aí a diga pra quem tiver esse problema futuramente.[/color]

3 Respostas

R

creio que vc deva pagar o seu “em” mais ou menos desta forma, e não injetá-lo…

FacesContextUtils.getWebApplicationContext(context).getBean("beanname");

veja se funciona

javer

Cara, obrigado pela resposta, mas o que seria o “beaname”? Não entendi.
Ahh, não estou usando Spring.

R

Hum, tendii…

achei esse post que explica o porque não funcionar injeção de dep dentro de um validator, tive o mesmo problema com um converter, porém com injeção do spring.

http://www.guj.com.br/java/221260-jsf-com-ejb-3---managedbean----facade----dao---problema-na-injecao-de-persistencia

Criado 12 de maio de 2014
Ultima resposta 12 de mai. de 2014
Respostas 3
Participantes 2