[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

dofun12

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?

dofun12

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?? :?:

dofun12

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}"/>
dofun12

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!!

dofun12

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();		
	}

}
dofun12

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
dofun12

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();
	}
dofun12

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.

edubiss

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?

edubiss

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.

benignoms

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