Mostrar erro durante persist no banco (ex: chave duplicada) na View. JSF + JPA + Postgre

29 respostas
P

Olá pessoal

Andei pesquisando, mas não consegui fazer com que o erro mostrado no banco, fosse apresentado na view (pelo componente do primefaces ‘messages’, por exemplo).
Gostaria de saber, uma forma de fazer isso…
Por exemplo, se for cadastrar um usuário, e na hora de inserir, o nome de login ja existir… no console do Eclipse ele mostra o erro do banco (erro de restrição de unicidade)… tem como mostrar esse erro, ou ate mesmo personaliza-lo e apresenta-lo na view??
Tentei algo assim:

public void cadastrar() {

		FacesContext context = FacesContext.getCurrentInstance();
		try {
			getEntityManager().getTransaction().begin();
			
			if (getSelecionado().getCod_usuario() == null) {
				getEntityManager().persist(usuario_selecionado);
			}
			getEntityManager().getTransaction().commit();

			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Cadastrado realizado com Sucesso!", ""));
			usuario_selecionado = null;

		} catch (org.hibernate.exception.ConstraintViolationException e) {
                //MOSTRAR ERRO
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
		}
	}

Mas não deu certo =/
Acredito que seja algo um pouco mais complexo… se alguem puder me dar uma luz… alguma referencia, tutorial para estudo… qualquer coisa será bem vinda!
Agradeço desde já!!
Obrigado!!

29 Respostas

L

Você chegou a ver se o seu método entra no catch ?

Não é melhor encapsular a sua mensagem em uma outra mais legível ?

Porque senão vai mostrar para o usuário uma mensagem em inglês e que ele não vai entender de erro de PK.

Você poderia pegar a exceção, pegar a mensagem associada a exceção e ver em qual erro ela se encaixa para criar uma mensagem sua personalizada.

P

Olá lele_vader, obrigado pela resposta! :smiley:

então… agora que voce comentou, coloquei um "System.out.println(“Erro: " + e.getMessage());” dentro do cacth, para ver se ele estava entrando…
e aparentemente não está… mas vc saberia me dizer pq??

quando ele encontra um erro nao deveria ir para o catch??
olha o erro, quando tendo colocar uma chave duplicada:

01/08/2012 10:09:45 com.sun.faces.lifecycle.InvokeApplicationPhase execute
AVISO: #{usuarioBean.cadastrar()}: javax.persistence.RollbackException: Error while committing the transaction
javax.faces.FacesException: #{usuarioBean.cadastrar()}: javax.persistence.RollbackException: Error while committing the transaction
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIData.broadcast(UIData.java:1093)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.el.EvaluationException: javax.persistence.RollbackException: Error while committing the transaction
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	... 24 more
Caused by: javax.persistence.RollbackException: Error while committing the transaction
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:90)
	at br.com.sico.bean.UsuarioBean.cadastrar(UsuarioBean.java:35)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	... 25 more
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: ERRO: duplicar valor da chave viola a restrição de unicidade "u_username"
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1360)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1288)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:78)
	... 34 more
Caused by: org.hibernate.exception.ConstraintViolationException: ERRO: duplicar valor da chave viola a restrição de unicidade "u_username"
	at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:128)
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
	at $Proxy25.executeUpdate(Unknown Source)
	at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2856)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3297)
	at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
	at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:275)
	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1127)
	at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:325)
	at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
	at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73)
	... 34 more
Caused by: org.postgresql.util.PSQLException: ERRO: duplicar valor da chave viola a restrição de unicidade "u_username"
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2096)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1829)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:510)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:386)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:332)
	at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
	at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
	... 50 more
L

Tenta colocar somente a classe da exceção.

…

catch(ConstraintViolationException e) {

}

Interessante é que ele jogou a exceção.
Tenta colocar essa classe PersistenceException em outro catch, pois pelo que vi você está usando jpa e colocando uma exceção específica do hibernate.

Por fim se ainda não descobrir coloque exception mesmo e dê uma olhada em qual classe a exceção se encontra.

P

obrigado pela atenção lele_vader :smiley:

então… fiz o que sugeriu, somente com:

catch(ConstraintViolationException e) { }
mas ele nao entrou no catch, e apareceu isso no console:

02/08/2012 22:30:16 org.apache.catalina.session.StandardManager doLoad
GRAVE: IOException while loading persisted sessions: java.io.EOFException
java.io.EOFException
	at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
	at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
	at java.io.ObjectInputStream.<init>(Unknown Source)
	at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)
	at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:246)
	at org.apache.catalina.session.StandardManager.load(StandardManager.java:204)
	at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5282)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
02/08/2012 22:30:16 org.apache.catalina.session.StandardManager startInternal
GRAVE: Exception loading sessions from persistent storage
java.io.EOFException
	at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
	at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
	at java.io.ObjectInputStream.<init>(Unknown Source)
	at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)
	at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:246)
	at org.apache.catalina.session.StandardManager.load(StandardManager.java:204)
	at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5282)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
02/08/2012 22:30:16 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-7070"]
02/08/2012 22:30:16 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
02/08/2012 22:30:16 org.apache.catalina.startup.Catalina start
INFO: Server startup in 5312 ms

outra coisa que fiz foi por outros catch:

catch (RollbackException e) { System.out.println(e.getMessage()); } catch (PersistenceException e) { System.out.println(e.getMessage()); }catch (Exception e) { System.out.println(e.getMessage()); }
em todos, ele entrou… e a messagem que ele imprimiu foi somente: Error while committing the transaction

o que voce acha??
e obrigado mais uma vez!

L

Você está escrevendo em arquivo ?
Porque está dando esse EOF exception ?

P

como assim escrevendo em arquivo?
sou novo ainda nisso… nem sei o que seria o EOF exception…

L

EOF é uma exceção de fim de arquivo.
Você está escrevendo em um file com HSQLDB não ?

P

Amigo, precisei fazer uma rápida pesquisa aqui para ver do que vc estava falando…

HSQLDB seria um banco de dados pelo visto, certo?

se for isso, acredito que eu não esteja fazendo isso não… (a não ser que, pela minha falta de experiencia, eu esteja fazendo algo sem saber que estou)

L

Me mostra o seu arquivo do hibernate

Agora já está entrando nos catch não é ?
Acho que não entrou em constraint, porque se não me engano essa exceção eu usei com arquivos do hibernate validator.

Debuga e ve o objeto da exceção para ver se tem algum atributo dizendo a mensagem do erro.
Acho que talvez o método getDetailedMessage

P

deixa só eu comentar uma coisa antes de continuar… andei mexendo no projeto por causa de otros problemas que estou tendo, dai fui testar agora inserir uma chave duplicada, e olha o erro que me apareceu

Ago 07, 2012 9:04:53 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
Grave: Error Rendering View[/sico/cadastro_usuario.xhtml]
java.lang.IllegalStateException: Cannot serialize a session while connected
	at org.hibernate.internal.SessionImpl.writeObject(SessionImpl.java:2030)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at java.util.HashMap.writeObject(HashMap.java:1014)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1362)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1170)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at java.util.HashMap.writeObject(HashMap.java:1014)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at com.sun.faces.renderkit.ClientSideStateHelper.doWriteState(ClientSideStateHelper.java:325)
	at com.sun.faces.renderkit.ClientSideStateHelper.writeState(ClientSideStateHelper.java:169)
	at com.sun.faces.renderkit.ResponseStateManagerImpl.getViewState(ResponseStateManagerImpl.java:135)
	at javax.faces.application.StateManager.getViewState(StateManager.java:555)
	at com.sun.faces.context.PartialViewContextImpl.renderState(PartialViewContextImpl.java:416)
	at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:300)
	at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
	at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:981)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:391)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

Ago 07, 2012 9:04:53 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet [Faces Servlet] in context with path [/sico] threw exception
java.lang.IllegalStateException: CDATA tags may not nest
	at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:630)
	at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:172)
	at javax.faces.context.PartialResponseWriter.startError(PartialResponseWriter.java:342)
	at org.primefaces.context.PrimePartialResponseWriter.startError(PrimePartialResponseWriter.java:210)
	at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:200)
	at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:123)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)

sem querer abusar, tem ideia do que seria?

o arquivo persistence.xml que me pediu

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="sico" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<non-jta-data-source>java:comp/env/jdbc/sicoDS</non-jta-data-source>
		
		<class>sico.modelo.Usuario</class>
		
		<properties>
			<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JDBCTransactionFactory" /> 
			<property name="hibenate.show_sql" value="true"/>
			<property name="hibernate.format_sql" value="true"/>
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/sico"/>
			<property name="javax.persistence.jdbc.user" value="postgres"/>
			<property name="javax.persistence.jdbc.password" value="*****"/>
			<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
		</properties>
		
	</persistence-unit>
</persistence>
L

você está fechando a conexão ?

Tem que dar um session.close no finally.

Acredito que o erro se refere a isso

P

to vendo que preciso estudar muito ainda… hehe

eu nao chego a criar uma sessão… estou usando annotacion @ViewScoped

como que irei fechar entao??

P

e estou apanhando tbm pra chamar o metodo getDetailedMessage que mencionou… ;/

L

Calma ai.
@ViewScoped e do jsf.
Não tem nada haver com hibernate ou jpa.

É como é jpa é para fechar o entityManager

entityManager.close

Dá uma olhada aqui.

http://uaihebert.com/?p=1414

L

Me mostra o seu dao por favor

L

Porque voce definiu usuário,senha e url no persistence.xml, se voce referenciou um jndi

java:comp/env/jdbc/sicoDS

Ali já teria usuário,senha,driver e url

P

vou dar uma olhada!!

assim que eu tiver novidades posto aqui!!
Obrigado mais uma vez pela ajuda, e pela paciência comigo… (:

Abraços

L

nada.
qualquer coisa manda msg para o meu e-mail.

P

agora que vi que pediu para mostrar o DAO

@ManagedBean
@ApplicationScoped
public class EntityManagerBuilder implements Serializable{

	private static final long serialVersionUID = 1L;
	private EntityManager entityManager;

	public EntityManager getEntityManager() {
		if(entityManager == null){
			createEntityManager();
		}
		return entityManager;
	}
	
	private void createEntityManager(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("sico");
		entityManager = factory.createEntityManager();
	}

}

Aqui eu estava apanhando no começo para fazer a conexao do Tomcat com o Posgresql… dai tentei de tudo, ate que deu heheheh

L

Porque você colocou essa classe como bean do jsf ?

P

Então… num treinamento que eu cheguei a fazer, o professor fez dessa maneira…
faltou ali o (eager=true), assim…

@ManagedBean(eager=true)
@ApplicationScoped
public class EntityManagerBuilder implements Serializable{

//....

e no meu bean, começo assim

public class UsuarioBean implements Serializable{

	@ManagedProperty(value="#{entityManagerBuilder.entityManager}")
	private EntityManager entityManager;
//.....
L

Se estiver usando cdi ou ejb pode injetar assim

@PersistenceContext(unitName=“nome da sua unidade de persistencia”)
private EntityManager em;

L

você faz a operação da jpa no managed bean ?

P

isso…

@ManagedBean
@ViewScoped
public class UsuarioBean implements Serializable{

	@ManagedProperty(value="#{entityManagerBuilder.entityManager}")
	private EntityManager entityManager;
	private static final long serialVersionUID = 1L;

	private Usuario selecionado;
	private List<Usuario> lista;
	
	public void salvar() {

		FacesContext context = FacesContext.getCurrentInstance();
		try {			
			getEntityManager().getTransaction().begin();
			
			if (getSelecionado().getCod_usuario() == null) {
				getEntityManager().persist(selecionado);
				context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Cadastro realizado com Sucesso!", ""));
				
			}else{
				getEntityManager().merge(selecionado);
				context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Cadastro alterado com Sucesso!", ""));
				
				resetUser();
				listar_usuario();
			}
			getEntityManager().getTransaction().commit();
			
			selecionado = null;
						
		} catch (Exception e) {
			System.out.println("Erro: Exception");
						
		}			
	}

       //....MAIS MÉTODOS E GETTERS E SETTERS
L

entao.
O erro lá da session é porque você não a fechou.
ela tem que ser fechada após cada transação.
Coloca no final um finally e chama

getEntityManager().close();

E depois separa essa aplicação em mais camadas.
Imagina se depois você não tem mais que fazê-la com jsf ou então usar outro framework

P

beleza entao… obrigado (:

o certo seria eu criar um DAO para cada entidade né?
tipo… no bean ficar só os métodos, mas para cada transação chamar o dao dai… tipo isso?

P

Nínguém nunca precisou fazer isso??
Eu não queria simplesmente dizer que houve um erro durante o cadastro… queria poder dizer qual foi esse erro…

eu pus assim na exception para testar:

} catch (PersistenceException e) {
	System.out.println("Persistence cause: " + e.getCause());
	System.out.println("Persistence msg: " + e.getMessage());
    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro persistence!",""));
}

Ele imprime no console:

Persistence cause: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: ERRO: duplicar valor da chave viola a restrição de unicidade "u_cpf"
Persistence msg: Error while committing the transaction

Não tem como eu pegar o erro que ta no getCause() e de alguma forma mostrar para o usuário??
outra coisa é que nem isso:

context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro persistence!",""));

ele mostra na tela :frowning:

R

Paulo,

Como ele está passando no catch e você está adicionando a mensagem (a principio parece estar correto), pode ser alguma falha no fluxo da tela!
Como você chama esse método? Via ajax? Se chama via ajax tem que dar um uptade no componente de mensagens. Se ele estiver dentro do mesmo form, de o update no @form

Pode postar aqui seu XHTML?

Att.

P

Olá Ronaldo, obrigado pela ajuda!

Então, eu dou um update no form sim, além de também eu deixar a propriedade autoUpdate=“true” no componente… vo postar aqui o xhtml de uma das páginas q tentei fazer isso e o metodo. Vo por o xhtml inteiro, para caso haja algum problema de componente fora do lugar certo

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

	<ui:composition template="/sico/novotemplateSico.xhtml">
	
		<ui:define name="titulo">Cadastro Usuário | SICO</ui:define>
		
		<ui:define name="nomepagina">Cadastro Usuário</ui:define>
		
		<ui:define name="icone"><p:graphicImage url="/resources/images/newuser.png" alt="Cadastro" title="Cadastro" 
		width="95" height="95" style="padding-right: 80px; padding-bottom: 15px;" /></ui:define>
		
		<ui:define name="conteudo">
			<div id="conteudo">
			<p:ajaxStatus style="width:64px;height:64px;position:fixed;left:50%;top:50%;margin-top:50px;">
				<f:facet name="start">
					<h:graphicImage value="/resources/images/ajax-loader1.gif" />
				</f:facet>
				<f:facet name="complete">
					<h:outputText value="" />
				</f:facet>
			</p:ajaxStatus> 
						
			<h:form id="form" prependId="false">
				<p:panel>
				<br />
				<div class="titulo">USUÁRIOS</div>
					<p:separator />
					<br />									
						<div style="margin: 0 auto; width: 800px">
						
							<h:panelGrid rendered="#{ctrlManterUsuario.panel}" columns="2" cellpadding="5" style="text-align: right">
								<h:outputLabel value="Nome Completo: * " />
								<h:panelGroup>
									<p:inputText value="#{ctrlManterUsuario.selecionado.nome}" style="width: 600px" />
								</h:panelGroup>
								
								<h:outputLabel value="Endereço: " />
								<h:panelGroup>
									<p:inputText value="#{ctrlManterUsuario.selecionado.endereco}" style="width: 440px"/>
									<p:spacer width="20" height="0" />
									<h:outputLabel value="Número: " />
									<p:inputText value="#{ctrlManterUsuario.selecionado.numero}" style="width: 70px"/>
								</h:panelGroup>
								
								<h:outputLabel value="Complemento: " />
								<h:panelGroup>
									<p:inputText value="#{ctrlManterUsuario.selecionado.complemento}" style="width: 200px"/>
									<p:spacer width="20" height="0" />
									<h:outputLabel value="Bairro: " />
									<p:inputText value="#{ctrlManterUsuario.selecionado.bairro}" style="width: 150px"/>
									<p:spacer width="20" height="0" />
									<h:outputLabel value="CEP: " />
									<p:inputMask value="#{ctrlManterUsuario.selecionado.cep}" mask="99999-999" style="width: 100px"/>
								</h:panelGroup>
								
								<h:outputLabel value="Cidade: " />
								<h:panelGroup>
									<p:inputText value="#{ctrlManterUsuario.selecionado.cidade}" style="width: 186px"/>
									<p:spacer width="20" height="0" />
									<h:outputLabel value="Estado: " />
									<p:inputMask mask="aa" value="#{ctrlManterUsuario.selecionado.uf}" style="width: 100px"/>
									<p:spacer width="20" height="0" />
									<h:outputLabel value="CPF: * " />
									<p:inputMask value="#{ctrlManterUsuario.selecionado.cpf}" mask="[telefone removido]" style="width: 150px"/>
								</h:panelGroup>
								
								<h:outputLabel value="RG: * " style="text-align: right"/>
								<h:panelGroup>
									<p:inputText value="#{ctrlManterUsuario.selecionado.rg}" style="width: 131px" />
									<p:spacer width="20" height="0" />
									<h:outputLabel value="Telefone 1: * " />
									<p:inputMask value="#{ctrlManterUsuario.selecionado.fone1}" mask="([telefone removido]" style="width: 122px"/>
									<p:spacer width="20" height="0" />
									<h:outputLabel value="Telefone 2: " />
									<p:inputMask value="#{ctrlManterUsuario.selecionado.fone2}" mask="([telefone removido]" style="width: 122px"/>
								</h:panelGroup>
								
								
								<h:outputLabel value="Nome de Usuário: * " />
								<h:panelGroup>
									<p:inputText value="#{ctrlManterUsuario.selecionado.username}" style="width: 125px"/>
									<p:spacer width="20" height="0" />
									<h:outputLabel value="Senha: * " />
									<p:password id="Senha" value="#{ctrlManterUsuario.selecionado.senha}" feedback="true" style="width: 110px" promptLabel="Digite uma senha" weakLabel="Fraca"  
                    				 goodLabel="Boa" strongLabel="Forte" match="Confirme_senha" required="true" validatorMessage="Senha e Confirmação de Senha devem ser iguais"/>
									<p:spacer width="20" height="0" />
									<h:outputLabel value="Confirme a senha: * " />
									<p:password id="Confirme_senha" style="width: 110px" required="true"/>	
								</h:panelGroup>
								
								<h:outputLabel value="Tipo de Usuário: * " />
								<p:selectOneRadio value="#{ctrlManterUsuario.selecionado.tipo_usuario}">
									<f:selectItem itemLabel="Dentista" itemValue="dentista"/>
									<p:spacer width="20" height="0" />
									<f:selectItem itemLabel="Funcionário" itemValue="funcionario"/>
								</p:selectOneRadio>
								<p:spacer />
								<p:spacer />
								*Campos Obrigatórios
							</h:panelGrid>

						</div>
						<div style="margin: 0 auto; width: 800px; text-align: left">
							<p:spacer/>
							<p:separator />
							<p:commandButton action="#{ctrlManterUsuario.inserirUsuario()}" rendered="#{ctrlManterUsuario.panel}" update="@form" value="Cadastrar" title="Cadastrar Funcionário" style="margin: 0 auto" icon="ui-icon-check" />
							<div style="margin: 0 auto; width: 800px; text-align: center;">
								<p:commandButton action="#{ctrlManterUsuario.novo_cadastro()}" global="false" rendered="#{ctrlManterUsuario.botao_novo}" update="@form" value="Novo Cadastro" title="Cadastrar novo Funcionário" icon="ui-icon-plusthick" />
							</div>
							<p:messages id="msg" autoUpdate="true" />				
						</div>
					</p:panel>
				</h:form>	
			</div>	
		</ui:define>
	</ui:composition>
</html>

Método:

public void inserirUsuario(){
		FacesContext context = FacesContext.getCurrentInstance();
		boolean cpf;
		try {
			if(getSelecionado().getSenha().length() >= 6){
				
				if (!getSelecionado().getRg().matches("[0-9]+")){
					context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Insira apenas números para o RG!",""));
					return;
				} else {
			
					cpf = validaCPF(getSelecionado().getCpf());
					if(cpf == true){
						usuarioDAO.beginTransaction();
						
						String nomeSacento = remover(getSelecionado().getNome());
						selecionado.setNomeSemAcento(nomeSacento);
						usuarioDAO.save(selecionado);
						
						usuarioDAO.commitAndCloseTransaction();
						context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuário cadastrado com Sucesso!",""));
						
						resetUser();
						panel = false;
						botao_novo = true;
					} else {
						System.out.println("cpf invalido");
						context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "CPF Inválido!",""));
					}
				}
			} else {
				context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Para sua segurança insira uma senha de pelo menos 6 caracteres!",""));
				return;
			}
			
		} catch (PersistenceException e){
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "ERRO!",""));
			System.out.println(e.getCause());
			System.out.println("entro no persistencia");
			
		} catch (Exception e) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "ERRO!",""));
			System.out.println(e.getCause());
		}
	}

Obrigado desde já!!!
Abraçoos

Criado 31 de julho de 2012
Ultima resposta 19 de set. de 2012
Respostas 29
Participantes 3