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

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.

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

}[/code]

Sendo que nos meus EJBs eu injeto normalmente:

[code]@Stateless
public class RemetenteServiceEJB extends AbstractPersistence<Remetente, Long> implements RemetenteService {

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

@Override
protected EntityManager getEntityManager() {
	return em;
}

…[/code]

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:

[code]@ManagedBean
@RequestScoped
public class ValidadorCNPJ implements Validator, Serializable {

private static final long serialVersionUID = -431497045485894897L;

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

…[/code]
Nas paginas xhtml deve ser chamando na propriedade binding do componente:

[color=green]Fica aí a diga pra quem tiver esse problema futuramente.[/color]

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

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

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