[RESOLVIDO] JSF 2.0 - Erro ao salvar view

24 respostas
C

Olá pessoal, sou novo no JSF e estou com um problema que não consigo resolver: Quando tento salvar minha view, gera erro no meu filtro. Se alguém puder me dar alguma dica fico muito agradecido!

Modelos:

Materia

@Entity
@Table(name="materia")
public class Materia implements Serializable {

	private static final long serialVersionUID = 5473593744415728352L;

	@Id
	@GeneratedValue
	private Long id;
	private String materia;

	// getters e setters
	// hash e equals

}

Professor

@Entity
@Table(name="professor")
public class Professor implements Serializable {

	private static final long serialVersionUID = -8859794913996726961L;

	@Id
	@GeneratedValue
	private Long id;
	private String nome;
	private String endereco;
	private String telefone;
	
	@ManyToMany
	@JoinTable(name="professor_materia", joinColumns={@JoinColumn(name="professor_id")},
			inverseJoinColumns={@JoinColumn(name="materia_id")})
	private List<Materia> materias;

	// getters e setters
	// hash e equals

}

Managed Beans:

Materia

@ManagedBean(name="materiaBean")
@RequestScoped
public class MateriaBean {

	private MateriaRN materiaRN;

	private Materia materia = new Materia();
	private ArrayList<Materia> lista;
	
	public String salvar(){
		materiaRN = new MateriaRN();
		materiaRN.salvar(materia);
		return null;
	}


	public Materia getMateria() {
		return materia;
	}


	public void setMateria(Materia materia) {
		this.materia = materia;
	}


	public List<Materia> getLista() {
		if(this.lista == null){
			materiaRN = new MateriaRN();
			this.lista = (ArrayList<Materia>) materiaRN.listar();
		}
		return this.lista;
	}


	public void setLista(List<Materia> lista) {
		this.lista = (ArrayList<Materia>) lista;
	}
	
	
}

Professor

@ManagedBean(name="professorBean")
@RequestScoped
public class ProfessorBean {

	private Professor professor = new Professor();
	private List<Professor> lista;
	private ProfessorRN professorRN = null;
	
	public String salvar(){
		professorRN = new ProfessorRN();
		this.professorRN.salvar(professor);
		return null;
	}

	public Professor getProfessor() {
		return professor;
	}

	public void setProfessor(Professor professor) {
		this.professor = professor;
	}

	public List<Professor> getLista() {
		if (lista == null){
			professorRN = new ProfessorRN();
			this.lista = professorRN.listar(); 
		}
		return this.lista;
	}

	public void setLista(List<Professor> lista) {
		this.lista = lista;
	}
	
	
}

View:

<h:body>
	<h2>Gerenciamento de Professores</h2>
	<br/>
	&lt;h:form id="cadastro"&gt;
		&lt;h:inputHidden value="#{professorBean.professor.id}"/&gt;
		&lt;h:messages/&gt;
		<br/>
		&lt;h:panelGrid columns="2" cellpadding="5"&gt;
			&lt;h:outputLabel value="Nome:" for="nome"/&gt;
			&lt;p:inputText value="#{professorBean.professor.nome}" id="nome" label="Nome" required="true"/&gt;
		
			&lt;h:outputLabel value="Endereço:" for="endereco"/&gt;
			&lt;p:inputText value="#{professorBean.professor.endereco}" id="endereco" label="Endereço" required="true"/&gt;
			
			&lt;h:outputLabel value="Telefone:" for="telefone"/&gt;
			&lt;p:inputMask value="#{professorBean.professor.telefone}" mask="([telefone removido]" size="14"
				id="telefone" label="Telefone" required="true"/&gt;
				
			&lt;h:outputLabel value="Matéria:" for="materia"/&gt;
			&lt;h:selectManyListbox value="#{professorBean.professor.materias}" size="5"&gt;
				&lt;f:selectItems value="#{materiaBean.lista}" var="var" itemLabel="#{var.materia}" itemValue="#{var}"/&gt;
			&lt;/h:selectManyListbox&gt;
				
			&lt;p:commandButton type="reset" value="Limpar"/&gt;
			&lt;p:commandButton action="#{professorBean.salvar}" value="Salvar" ajax="false"/&gt;
		&lt;/h:panelGrid&gt;
	&lt;/h:form&gt;
	<br/><br/>
	&lt;h:form id="lista"&gt;
		&lt;h:dataTable var="professores" value="#{professorBean.lista}" border="1" rules="all" cellpadding="5"&gt;
			&lt;f:facet name="header"&gt;Listagem de Professores&lt;/f:facet&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;Id&lt;/f:facet&gt;
				#{professores.id}
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;Nome&lt;/f:facet&gt;
				#{professores.nome}
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;Endereço&lt;/f:facet&gt;
				#{professores.endereco}
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;Telefone&lt;/f:facet&gt;
				#{professores.telefone}
			&lt;/h:column&gt;
			&lt;h:column&gt;
				&lt;f:facet name="header"&gt;Matérias&lt;/f:facet&gt;
				#{professores.materias}
			&lt;/h:column&gt;
		&lt;/h:dataTable&gt;
	&lt;/h:form&gt;
&lt;/h:body&gt;

Erro:

Hibernate: 
    /* criteria query */ select
        this_.id as id1_0_,
        this_.materia as materia1_0_ 
    from
        materia this_
Nov 21, 2012 1:33:41 PM com.sun.faces.renderkit.html_basic.HtmlBasicRenderer getForComponent
WARNING: Não foi possível encontrar o componente com a ID materia na exibição.
Hibernate: 
    /* insert com.matrix.modelo.professor.Professor
        */ insert 
        into
            professor
            (endereco, nome, telefone, id_turma) 
        values
            (?, ?, ?, ?)
Hibernate: 
    /* criteria query */ select
        this_.id as id2_2_,
        this_.endereco as endereco2_2_,
        this_.nome as nome2_2_,
        this_.telefone as telefone2_2_,
        this_.id_turma as id5_2_2_,
        turma2_.id_turma as id1_3_0_,
        turma2_.turma as turma3_0_,
        turma2_.turno_id as turno3_3_0_,
        turno3_.id as id4_1_,
        turno3_.turno as turno4_1_ 
    from
        professor this_ 
    left outer join
        turma turma2_ 
            on this_.id_turma=turma2_.id_turma 
    left outer join
        turno turno3_ 
            on turma2_.turno_id=turno3_.id
Hibernate: 
    /* insert collection
        row com.matrix.modelo.professor.Professor.materias */ insert 
        into
            professor_materia
            (professor_id, materia_id) 
        values
            (?, ?)
632114 [http-8080-3] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.matrix.modelo.materia.Materia.id
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230)
	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852)
	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3560)
	at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:204)
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:449)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:132)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:816)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1204)
	at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:183)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at com.matrix.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:30)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.matrix.modelo.materia.Materia.id to java.lang.String
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
	at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source)
	at java.lang.reflect.Field.get(Unknown Source)
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
	... 31 more
Nov 21, 2012 1:33:41 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
javax.servlet.ServletException
	at com.matrix.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:40)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

24 Respostas

D

Ta faltando um elemento com id “materia” na View.
Evite deixar um elemento do back bean “solto”. Exemplo:
ao inves de #{professores.id}
coloque :

<h:outputText value="#{professores.id}"/>

é praticamente a mesma coisa,porem ele renderiza um sobre o texto.
Outra coisa segundo o dialogo de erro,vc esta tentando mudar um tipo long atraves de uma string

C

Obrigado pela resposta dofun12!

Então, adicionei um inputHidden com materia.id e parou de apresentar o erro relacionado à isso:

<h:inputHidden value="#{materiaBean.materia.id}"/>

No entanto, continua apresentando erro do hibernate e no filtro:

58137 [http-8080-4] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.matrix.modelo.materia.Materia.id
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230)
	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852)
	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3560)
	at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:204)
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:449)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:132)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:816)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1204)
	at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:183)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at com.matrix.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:30)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.matrix.modelo.materia.Materia.id to java.lang.String
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
	at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source)
	at java.lang.reflect.Field.get(Unknown Source)
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
	... 31 more
Nov 21, 2012 3:12:14 PM com.sun.faces.renderkit.html_basic.HtmlBasicRenderer getForComponent
WARNING: Não foi possível encontrar o componente com a ID materia na exibição.
Nov 21, 2012 3:12:14 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
javax.servlet.ServletException
	at com.matrix.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:40)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

Creio que esteja ligado ao h:selectManyListbox, mas não consigo entender o que fazer para corrigir isso. Alguma sugestão?

D

Substitui :

<h:selectManyListbox value="#{professorBean.professor.materias}" size="5">  
    <f:selectItems value="#{materiaBean.lista}" var="var" itemLabel="#{var.materia}" itemValue="#{var}"/>  
</h:selectManyListbox>

Por :

<h:selectManyListbox value="#{professorBean.professor.materias}" size="5">  
    <f:selectItems value="#{materiaBean.lista}" var="var" itemLabel="#{var.materia}" itemValue="#{var.id}"/>  
</h:selectManyListbox>

Porque o “#{professorBean.professor.materias}” e um tipo long,e o itemValue="#{var} e a mesma coisa que o objeto materia em String,dai vem o Erro.

C

Fiz a alteração mas continua dando erro:

Hibernate: 
    /* criteria query */ select
        this_.id as id1_0_,
        this_.materia as materia1_0_ 
    from
        materia this_
Nov 21, 2012 3:41:33 PM com.sun.faces.renderkit.html_basic.HtmlBasicRenderer getForComponent
WARNING: Não foi possível encontrar o componente com a ID materia na exibição.
Hibernate: 
    /* insert com.matrix.modelo.professor.Professor
        */ insert 
        into
            professor
            (endereco, nome, telefone, id_turma) 
        values
            (?, ?, ?, ?)
Hibernate: 
    /* criteria query */ select
        this_.id as id2_2_,
        this_.endereco as endereco2_2_,
        this_.nome as nome2_2_,
        this_.telefone as telefone2_2_,
        this_.id_turma as id5_2_2_,
        turma2_.id_turma as id1_3_0_,
        turma2_.turma as turma3_0_,
        turma2_.turno_id as turno3_3_0_,
        turno3_.id as id4_1_,
        turno3_.turno as turno4_1_ 
    from
        professor this_ 
    left outer join
        turma turma2_ 
            on this_.id_turma=turma2_.id_turma 
    left outer join
        turno turno3_ 
            on turma2_.turno_id=turno3_.id
Hibernate: 
    /* insert collection
        row com.matrix.modelo.professor.Professor.materias */ insert 
        into
            professor_materia
            (professor_id, materia_id) 
        values
            (?, ?)
469197 [http-8080-3] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.matrix.modelo.materia.Materia.id
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230)
	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852)
	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3560)
	at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:204)
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:449)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:132)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:816)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1204)
	at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:183)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at com.matrix.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:30)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.matrix.modelo.materia.Materia.id to java.lang.String
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
	at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source)
	at java.lang.reflect.Field.get(Unknown Source)
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
	... 31 more
Nov 21, 2012 3:41:33 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
javax.servlet.ServletException
	at com.matrix.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:40)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
C

Alguém tem mais alguma idéia que possa me ajudar?

Acho que o problema está pode estar no relacionamento entre a classe Professor e Materia, mas não consigo ter nenhuma idéia do que possa ser.

C

Ninguém?? :?:

D

Depois da alteração,vc tentou dar Redeploy ou reset no Server?

C

Sim, dei clean e depois publish no tomcat.

A parte do erro:

137174 [http-8080-3] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.matrix.modelo.materia.Materia.id

e

Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.matrix.modelo.materia.Materia.id to java.lang.String

Indicam que é algo relacionado com o Id da classe Materia. Estou buscando o conteúdo do f:selectItems em uma lista (materiaBean.lista), será que é aí que está o problema?

<f:selectItems value="#{materiaBean.lista}" var="var" itemLabel="#{var.materia}" itemValue="#{var.id}"/>
D

Cara tenta,mudar esse trecho:

<f:selectItems value="#{materiaBean.lista}" var="var" itemLabel="#{var.materia}" itemValue="#{var}"/>

por:

<f:selectItem itemLabel="Teste1" itemValue="9999"/>
 <f:selectItem itemLabel="Teste2" itemValue="9999"/>

e veja se funciona

C

Fiz a alteração, colocando no caso o itemLabel e o itemValue correspondentes ao que já existe gravado na tabela Materia no banco de dados:

<f:selectItem itemLabel="matematica" itemValue="1"/>
<f:selectItem itemLabel="geografia" itemValue="2"/>

Mas continua dando o mesmo erro.

227386 [http-8080-4] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.matrix.modelo.materia.Materia.id

Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.matrix.modelo.materia.Materia.id to java.lang.String

Definitivamente parece que o Hibernate não consegue pegar o id de Materia e porquê ele não consegue converter de Long para String. Teria que colocar um conversor alí? Como ficaria?

Valeu pela atenção na ajuda!!

D

Mostre a parte de conexao com o banco(DAO),talvez o problema possa ser la

C

HibernateUtil:

public class HibernateUtil {

	private static final SessionFactory sessionFactory = buildSessionFactory();
	private static SessionFactory buildSessionFactory(){
		try{
			AnnotationConfiguration config = new AnnotationConfiguration();
			config.configure("hibernate.cfg.xml");
			return config.buildSessionFactory();
		}catch(Throwable e){
			System.out.println("Criação inicial de SessionFactory falhou. \nErro: " + e.getMessage());
			throw new ExceptionInInitializerError(e);
		}
	}
	
	public static SessionFactory getSessionfactory() {
		return sessionFactory;
	}
}

E o filtro que aciona o hibernate:

public class ConexaoHibernateFilter implements Filter {

	private SessionFactory sf;
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {

		try{
			this.sf.getCurrentSession().beginTransaction();
			chain.doFilter(request, response);
			this.sf.getCurrentSession().getTransaction().commit();
			this.sf.getCurrentSession().close();
		}catch(Throwable e){
			try{
				if(this.sf.getCurrentSession().getTransaction().isActive()){
					this.sf.getCurrentSession().getTransaction().rollback();
				}
			}catch(Throwable t){
				t.printStackTrace();
			}
			throw new ServletException();
		}
		
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		this.sf = HibernateUtil.getSessionfactory();		
	}

}
D

Poderia postar a parte em que tem as Querys para insercao e select do Professor e Materia?

C

Quando tento salvar o Hibernate gera as queries:

Hibernate: 
    /* insert com.matrix.modelo.professor.Professor
        */ insert 
        into
            professor
            (endereco, nome, telefone) 
        values
            (?, ?, ?)
Hibernate: 
    /* insert collection
        row com.matrix.modelo.professor.Professor.materias */ insert 
        into
            professor_materia
            (professor_id, materia_id) 
        values
            (?, ?)

aí dá o erro:

1926645 [http-8080-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.matrix.modelo.materia.Materia.id
D

O Problema pode ser na lista,que vc pega da classe ProfessoresRN

C

a lista de Materia eu chamo do backing bean MateriaBean:

public List<Materia> getLista() {
		if(this.lista == null){
			materiaRN = new MateriaRN();
			this.lista = (ArrayList<Materia>) materiaRN.listar();
		}
		return this.lista;
	}

que chama o MateriaRN:

public MateriaRN() {
		this.materiaDAO = DAOFactory.criarMateriaDAO();
	}

que por sua vez chama da classe que chama diretamente no DAO:

public List<Materia> listar() {
		return this.session.createCriteria(Materia.class).list();
	}
D

Me desculpe,mas não sei como te ajudar… :?

C

Vlw dofun12, obrigado pela força!

Estou quebrando a cabeça, se conseguir resolver posto aqui.

E

cnidhogg,

Provavelmente tu vai ter que implementar um conversor para esse h:selectManyListbox. Até onde sei, ele sempre vai te retornar uma String no itemValue dele. Nesse caso tu deve converter essa String para o tipo que você quer. No teu caso um Long. Tenta usar o conversor pra Long do próprio JSF (LongConverter) ou tenta criar esse conversor:

public class LongConverter {

    @Override
    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
        if (value != null) {
            try {
                return Long.valueOf(value);
            } catch (NumberFormatException e) {
                return null;
            }
        }

        return null;
    }

    @Override
    public String getAsString(FacesContext ctx, UIComponent component, Object value) {
        if (value != null) {
            return value.toString();
        }

        return "";
    }
}

Depois coloca o conversor na tua lista e ve se resolve.

C

edubiss, tentei as implementações conforme vc falou, mas nenhuma funcionou.

1º tentei usando o conversor padrão:

<h:selectManyListbox value="#{professorBean.professor.materias}" size="5">
				<f:selectItems value="#{materiaBean.lista}" var="var" itemLabel="#{var.materia}" itemValue="#{var.id}"/>
				<f:converter  converterId="javax.faces.Long"/>
			</h:selectManyListbox>

2º depois criei uma classe de conversão, seguindo seu código. Tentando definir essa classe na propriedade converterId dava erro dizendo que não conseguia localizar o conversor. Tentei implementar a tag @FacesConverter(forClass = Materia.class) na própria classe de conversão, mas também não adiantou.

Quando tento salvar, vem o mesmo erro:

21726 [http-8080-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.matrix.modelo.materia.Materia.id
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230)
	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852)
	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3560)
	at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:204)
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:449)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:132)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:816)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1204)
	at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:183)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at com.matrix.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:30)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.matrix.modelo.materia.Materia.id to java.lang.String
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
	at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source)
	at java.lang.reflect.Field.get(Unknown Source)
	at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
	... 31 more
Nov 22, 2012 4:02:39 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
javax.servlet.ServletException
	at com.matrix.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:40)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

O que achei estranho é que, quando eu usei o conversor padrão, conforme descri no nº 1, o erro vinha descrito como :

Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.matrix.modelo.materia.Materia.id to java.lang.Long

Aí que eu não entendi mais nada. Alguma outra idéia do que possa resolver?

E

cnidhogg,

Bom, eu tenho uma outra ideia que deve funcionar. Tu pode mapear essa lista do h:selectManyListbox no teu Bean e não como objeto. Explico:

No Bean você teria uma lista de String (que é o que h:selectManyListbox espera).

private List<String> materiasSelecionadas = new ArrayList<String>();

Na tela tu mapearia isso no h:selectManyListbox.

<h:selectManyListbox value="#{professorBean.materiasSelecionadas}"> //resto do codigo sem o conversor

O detalhe é que na hora de salvar, tu terá que converter essa lista, para as materias do teu relacionamento.

for (String id : materiasSelecionadas) { Materia materia = new Materia(Long.valueOf(id)); professor.getMaterias().add(materia); } professorRN.salvar(professor);

Tenta dessa forma e vê se da certo…

C

edubiss,

Obrigado pela dica, tentei implementar aqui mas não estou conseguindo fazer o selectManyListbox carregar a lista de String, provavelmente ignorância minha.

B

Vamos lá:

  1. Sobrescreva o método toString() de Materia.

  2. Crie um conversor:

Veja este exemplo e tente adaptar ao seu projeto.

@FacesConverter(value = "materiaConverter", forClass = pacote.Materia.class)
public class MateriaConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        MateriaDAO materiaDAO = new MateriaDAO();
        Materia materia = null;
        if ((value != null) && (!value.equals(""))) {
            materia = materiaDAO.buscarPorId(new Long(value));
        }
        return materia;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        String retorno = "";
        if (!value.equals("")) {
            Materia materia = (Materia) value;
            if (!(materia.getId() == null)) {
                retorno = materia.getId().toString();
            }
        }
        return retorno;
    }
}

Adicione o conversor ao componente:

<h:selectManyListbox value="#{professorBean.professor.materias}" size="5" converter="materiaConverter">  
                <f:selectItems value="#{materiaBean.lista}" var="var" itemLabel="#{var.materia}" itemValue="#{var}"/>  
</h:selectManyListbox>

Acredito que com isto funcionará.

C

benignoms, funcionou conforme sua dica!

Muito obrigado! Vlw a todos que tentaram me ajudar!

Criado 21 de novembro de 2012
Ultima resposta 23 de nov. de 2012
Respostas 24
Participantes 4