[RESOLVIDO]Capturando exceção e mostrando mensagem em pagina jsf

Ola pessoal,estou com um problema em capturar uma exceção especifica e a partir dai mostrar uma mensagem na minha página.Estou usando o catch para capturar ConstraintViolationException depois relanço até minha classe bean uma exceção nova que criei,assim eu capturo a mesma e dentro do catch da bean uso uma faces message.Mas acontece o seguinte a mensagem não e mostrada na pagina,ja verifiquei se tudo ocorre como planejei e pelo que eu sei esta certo.

este é o codigo da minha classe de persitencia:

	@Override
	public void salvar(Empresa empresa) throws DAOException{		
			
		try{
			
		this.session.save(empresa);
		this.session.flush();
		
		}catch(ConstraintViolationException e){
			
			throw new DAOException ("chave duplicada");
					
		}
			   		
	}

Depois de lançar esta exceção DAOException, é relançada por mais duas classes até chegar na classe bean que o codigo esta aqui:

public String salvar(){

	EmpresaRN empresaRN = new EmpresaRN();
		
	if(empresaSelecionada.getCod_empresa() == null){
					
		try {
			
			empresaRN.salvar(empresa);
			return "/publico/cadastro_empresa.xhtml";
			
		} catch (DAOException  e) {
			
			if(e.getMessage() != null){

				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Warning!", e.getMessage()));			
								
				System.out.println("erro1:" + e);
									
			}	
			
			e.printStackTrace();
		}
					
	}else{
		
		empresaRN.atualizar(empresa);
		return "/publico/cadastro_empresa.xhtml";
	}
	return null;		
	
}	

Por ultimo aqui está minha pagina jsf:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"> 

<h:head>
<title>Empresa</title>

<f:metadata>
	    
 <f:viewParam name = "cd_em" value = "#{empresaBean.empresaSelecionada.cod_empresa}"/>
		     		
</f:metadata>

</h:head> 
	
	<ui:composition template="/template/interna.xhtml">
	
			<ui:define name="titulo">Cadastro de Empresa</ui:define>
	
			<ui:define name="corpo">
				        			           	 			          	   
           	   		<h:form id = "cadastroEmpresa">
           	   		     	   		
           	   		 <p:messages id="messages" showDetail="true"
           	   			 closable="true"
           	   			 autoUpdate="true"/>     
           	   		
	           		
           	   			<div class = "ui-fluid">
           	            
			           	   	<p:panelGrid columns="2" styleClass="ui-panelgrid-blank" >   
			           	   	  			           	   			           	   	  		
					          <p:outputLabel value = "Código Empresa" for = "codigoEmpresa"/>
					          <p:inputText value="#{empresaBean.iniciar().cod_empresa}"
				           	    required="true"
				           	    id = "codigoEmpresa"
				           	    maxlength="11"				           	  
					           	disabled = "#{empresaBean.opcao()}"/>

			           		   
			           		   <p:outputLabel value="Descrição:" for = "descrição"/>	
			           		   <p:inputText value="#{empresaBean.iniciar().descricao}"
			           		   required="true"
			           		   id = "descrição"
			           		   maxlength="60"
			           		   size = "60"
			           		   validatorMessage="O campo descrição deve ter no máximo 60 caracteres">
			           		   <f:validateLength minimum="1" maximum="60"/> 
			           		   
			           		   </p:inputText>
			           		   
			           		   		<p:commandButton action = "#{empresaBean.salvar()}" 
			           		   		value = "Salvar"
			           		   		/> 
			           		   	   		
			           		   </p:panelGrid>
			           		   
			           		  
			           									           		
		           		</div> 
		           			           		
		           	</h:form>
           							
			</ui:define>
			
	</ui:composition>
	 
</html>

Obrigado desde já pessoal!

Obs:Estou usando Hibernate.

Bom dia! Pq vc n usa uma String para mostrar o erro?

@Override
	public void salvar(Empresa empresa) throws DAOException{		
			
		try{
			
		this.session.save(empresa);
		this.session.flush();
		
		}catch(ConstraintViolationException e){
			this.menssagemErro = (e.toString());
			throw new DAOException ("chave duplicada");
					
		}
			   		
	}

E na página tu mostra a mensagem…

1 curtida

Bom dia!

Pois é,estou tentando implementar isso neste exato momento mas como vou mostrar essa mensagem na minha bean?eu criei um componente output text mas ainda n encontrei uma forma de mostrar esta mensagem pois ela esta dentro do meu metodo salvar :frowning:

Tipo eu faço assim…

Crio uma variavel mensagem no bean…
em todos os tratamentos de erro atribuo a ela o valor do erro.toString…

e chamo um popup mostrando ela na pagina…

No Bean:

public void seuMetodo(){
    try {
         ...
         ...
         ...
        } catch (Exception e) {
           this.mensagemDeErro = "METODO: " + metodo + " | ERRO: " + e.toString();
           RequestContext.getCurrentInstance().execute("PF('dlgErro').show()");
        }
}

Na pagina:

<p:confirmDialog id="dlgErro" widgetVar="dlgErro" message="#{seuBean.mensagemDeErro}"
                            showEffect="bouce" hideEffect="explode" closeOnEscape="true"
                            header="Alerta!"/>
1 curtida

Gostei da sugestão vou tentar implementar aqui,Obg!

Nao consegui,na verdade acho que o meu erro é com tipo de excecao que estou capturando pois quando fiz um tipo de transação inadequada e tratei esta excecao do mesmo jeito que fiz acima a mensagem apareceu de uma olhada no console parece estar td certo:

A exceção que tento capturar é a de duplicidade de dados do hibernate,mas talvez n seja esta a correta,o mais estanho de tudo é que no catch da minha classe bean mostra o stracktrace,mostra meu println menos a mensagem que quero mostrar na tela

vc está dando update no campo da tela? quando clica no botão "salvar?

1 curtida

Sim,eu ja consegui mostrar a mensagem mas foi com outro tipo de excecao,foi a excecao "nested transactions not supported " com esse tipo de exceção de duplicidade não da certo de jeito nenhum.

A principio eu pensei que era alguma coisa errada na minha pagina jsf mas esta td certo.