JSF: Validador para campo unique no banco

Ola,
Estava tendo dificuldades pra validar o email com unique constrait. Usando Spring-Data JPA, pq a exception disparada nao funciona para usar no bloco try/catch. Entao resolvi fazer um validador. O validador funciona, porem quando vai editar a entidade, ele tambem valida o email. Nesse caso fiz a solucao dessa maneira, porem gostaria de saber se essa é a forma certa. Se tem uma forma mais elegante. Eu fiz a validacao dessa forma para o campo na view ficar destacado, mas poderia disparar um NegocioException tambem, mas qual a melhor maneira?

public void validarEmail(FacesContext context, UIComponent toValidate, Object value) {
    Integer idUsuario = null;
    
    UIComponent pai = toValidate.getParent();
    for (UIComponent input : pai.getChildren()) {
        if (input.getId().equals("idUsuario")) {
            idUsuario = (Integer) ((UIInput) input).getValue();
        }
    }
    String email = (String) value;
    Usuario validaUsuario = usuarioService.findByEmail(email);
    if (validaUsuario != null && idUsuario==null) {
        ((UIInput) toValidate).setValid(false);
        FacesUtil.adicionarMensagemErro("Ja existe usuário cadastrado com esse email.", null);
    }
}

Bom dia Thimor,

Tem essa abordagem também, da uma olhada e vê o que você acha.

ManagedBen:

@ManagedBean
@ViewScoped
public class FormularioEntidadeMB implements Serializable {
	
	@EJB
	private EntidadeServiceLocal entidadeService;

	public String salvar() throws Exception {
		try {
			entidadeService.salvar(entidade);
			adicionarMensagemDeSucesso("Entidade incluída com sucesso.");
		} catch(RegraNegocioException e){
			adicionarMensagemDeAlerta(e.getMessage());
		} catch (Exception e) {
			LOGGER.error("Erro no salvar", e);
			throw new Exception(e);
		}
		return null;
	}

}

Session bean:

@Stateless
public class EntidadeServiceImpl implements EntidadeServiceLocal {
	
	@Inject
	private EntidadeDAO entidadeDAO;
	
	@Override
	public Entidade salvar(Entidade entidade) throws Exception {
                // Esse metodo pode lançar RegraNegocioException
		new EntidadeValidator(entidade).validar();
		entidadeDAO.inserir(entidade);
		return entidade;
	}

}

Opa, blz? tambem pensei nessa abordagem. Da para fazer assim tambem. So que assim, eu nao consigo passar para a view qual foi o campo que deu problema na validacao para o css destacar ele, correto?

Att
Thiago Moreno

Correto.