Problemas em capturar exceptions JSF!

Bom dia Srs,

Frequento o forum a um tempo … mas normalmente não há necessidade de postar , pois ja acho nos tópicos já criados …
mas esse problema estou a um tempo procurnado e não consigo achar algo aplicável :x

pois bem, estou querendo capturar uma exception lançada no set da minha entidade e exibi-la de forma amigável para o usuário … ja faço uma validação na tela … mas estou tentando entender como fazer isso no .java ,

se eu fizer isso :

no xhtml :

[code]
<p:messages id=“message” />
//mais código
<h:outputLabel value="#{msgs[‘pages.aeroporto.cadastro.cidade’]} :“
for=“cidade” />
<p:inputText id=“cidade” value=”#{aeroportoBean.aeroporto.cidade}“
required=“true"
requiredMessage=”#{msgs[‘exception.negocio.cidade.obrigatorio’]}” />

// outros campos

<p:commandButton update="tabela,message"
oncomplete=“dialogAeroporto.hide();“
actionListener=”#{aeroportoBean.insert}“
value=”#{msgs[‘botao.cadastrar’]}“
rendered=”#{aeroportoBean.aeroporto.id == 0}” />[/code]

na entidade :

public void setCidade(String cidade) throws NegocioException { cidade.trim(); if (cidade == null || cidade.isEmpty()) throw new NegocioException( ResBundle.MESSAGE .getString("exception.negocio.cidade.obrigatorio")); if (cidade.length() > 20) throw new NegocioException( ResBundle.MESSAGE .getString("exception.negocio.cidade.caractere")); this.cidade = cidade; }

no bean :

public void insert(ActionEvent actionEvent) throws NegocioException { try { service.Insert(aeroporto); Mensagem.adicionarMensagemSucesso("Cadastrado com sucesso!"); } catch (Exception e) { Mensagem.adicionarMensagemErro(e.getMessage()); } }

dessa forma se tudo der certo , ele insere normal no banco … mas caso dê alguma exceção lá na entidade … por ex o campo tiver + de 20 caracteres , ele nao insere realmente … mas eu não consigo capturar essa mensagem lançada lá!

caso eu faça assim no bean :

[code]public void insert(ActionEvent actionEvent) throws NegocioException {
try {
if (aeroporto.getCidade().length() > 5) //só pra testar!
throw new NegocioException(
ResBundle.MESSAGE.getString(“exception.negocio.cidade.caractere”));

		service.Insert(aeroporto);
		Mensagem.adicionarMensagemSucesso("Cadastrado com sucesso!");
	} catch (Exception e) {
		Mensagem.adicionarMensagemErro(e.getMessage());
	}
}[/code]

eu consigo mandar pra tela essa mensagem.
a duvida é… eu preciso fazer essas validações no bean? ou tem algum jeito de capturar essa exception lançada lá na entidade?

Se alguem puder ajudar , agradeço desde já!

Provavelmente o seu metodo setCidade não está sendo chamado dentro de um bloco de codigo que trata a exceção.
Em qual momento vc chama o setCidade na sua lógica?

quando eu faço isso aqui …

<p:inputText id="cidade" value="#{aeroportoBean.aeroporto.cidade}" >

ele não chama pelo bean os sets da entidade?

pq a exception chega a ser lançada … só não consigo capturar ela pq no bean não tem algo que trate isso .

relacionado ao aeroporto só tem isso …

public Aeroporto getAeroporto() {
		return aeroporto;
	}

public void setAeroporto(Aeroporto aeroporto) {
	this.aeroporto = aeroporto;
        }

Desculpe não tinha visto o código da página direito, ele chama o set sim, porém ele chama antes de chegar ao código do bean.
o ciclo do JSF possui 5 fases, creio que no momento da chamada ao setCidade eles está na fase “update Model Values” que é fazer com que os dados sejam populados nos beans. Creio que uma exception lançada nesta fase não possa ser capturada, pelo menos não no bean.

Como solução só consigo pensar em retirar essa validação do set ou dar uma estudada nas fases do JSF e ver se é possivel capturar essa exceção de alguma forma.

segue um link explicando sobre as fases: http://marcusmazzo.wordpress.com/2008/12/13/ciclo-de-vida-jsf/

vlw FieroddPJ …

eu ja tinha visto esse post ai :slight_smile:

tava pensando aqui em fazer algo do tipo :

	public void insert(ActionEvent actionEvent) throws NegocioException {
		try {
			if (validarCampos(aeroporto)) {
				service.Insert(aeroporto);
				Mensagem.adicionarMensagemSucesso("Cadastrado com sucesso!");
			}
		} catch (Exception e) {
			Mensagem.adicionarMensagemErro(e.getMessage());
		}
	}

	public boolean validarCampos(Aeroporto aeroporto) {
		boolean valid = true;

		aeroporto.getNome().trim();
		if (aeroporto.getNome() == null || aeroporto.getNome().isEmpty()) {
			valid = false;
			Mensagem.adicionarMensagemErro(ResBundle.MESSAGE
					.getString("exception.negocio.nome.obrigatorio"));
		}
		if (aeroporto.getNome().length() > 45) {
			valid = false;
			Mensagem.adicionarMensagemErro(ResBundle.MESSAGE
					.getString("exception.negocio.nome.caractere"));
		}

///demais validações ...


		return valid;
	}

e tirar dos sets a validação …

valeu :smiley: