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]