Erro com JSF, Hibernate e Spring

4 respostas
F

Oi galera, to quebrando cabeça aqui pra fazer um sistema web, com as tecnologias citadas acima, mas me deparei com um erro q não tô conseguindo solucionar, então vim aqui pedir a ajuda de vcs;
o salvamento está sendo feito normalmente, mas quando clico em Atualizar ou Excluir acontece o erro:

Meu xhtml está assim:

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

<ui:composition template="template.xhtml">
	<ui:define name="titulo">Local de Trabalho</ui:define>
	<ui:define name="content">
		<div id="formulario"><h:panelGrid columns="3">
			<h:outputText value="Local de Trabalho:" />
			<h:inputText id="localtrabalho"
				value="#{localtrabalhoController.localtrabalho.nomeempresa}"
				required="true" requiredMessage="Campo obrigatório" />
			<h:message for="localtrabalho" /><br />
		</h:panelGrid> <h:panelGrid columns="2">
			<h:commandLink action="#{localtrabalhoController.salvar}">
				<h:graphicImage value="/imagens/site/salvar.gif"
					style="border: none;" alt="Salvar" />
			</h:commandLink>
		</h:panelGrid><br /> <rich:dataTable id="local" value="#{localtrabalhoController.todos}"
			rendered="#{not empty localtrabalhoController.todos}" var="l"
			rows="15">
			<rich:column>
				<f:facet name="header">
					<h:outputText value="Id" />
				</f:facet>
				<h:outputText value="#{l.idlocaltrabalho}" />
			</rich:column>
			<rich:column>
				<f:facet name="header">
					<h:outputText value="Descrição" />
				</f:facet>
				<h:outputText value="#{l.nomeempresa}" />
			</rich:column>
			<rich:column>
				<h:commandLink value="Atualizar"
					action="#{localtrabalhoController.editar}" />
				<f:facet name="header">
					<h:outputText value="Atualizar" />
				</f:facet>
			</rich:column>
			<rich:column>
				<h:commandLink value="Excluir"
					action="#{localtrabalhoController.excluir}" />
				<f:facet name="header">
					<h:outputText value="Excluir" />
				</f:facet>
			</rich:column>

			<f:facet name="footer">
				<rich:datascroller />
			</f:facet>
		</rich:dataTable></div>
	</ui:define>
</ui:composition>

</html>

Meu controller tá assim:

package br.org.creapi.controller;

import javax.annotation.Resource;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.org.creapi.dao.DaoGenerico;
import br.org.creapi.entities.Localtrabalho;

@Controller("localtrabalhoController")
@Scope("session")
public class LocaltrabalhoController {
	
	private Localtrabalho localtrabalho;
	private DataModel model;

	public Localtrabalho getLocaltrabalho() {
		return localtrabalho;
	}

	public void setLocaltrabalho(Localtrabalho localtrabalho) {
		this.localtrabalho = localtrabalho;
	}

	public DataModel getModel() {
		return model;
	}

	public void setModel(DataModel model) {
		this.model = model;
	}

	public DaoGenerico<Localtrabalho, Integer> getLocaltrabalhoDao() {
		return localtrabalhoDao;
	}

	public void setLocaltrabalhoDao(DaoGenerico<Localtrabalho, Integer> localtrabalhoDao) {
		this.localtrabalhoDao = localtrabalhoDao;
	}

	@Resource
	private DaoGenerico<Localtrabalho,Integer> localtrabalhoDao;
	
	public LocaltrabalhoController(){
		
	}
	
	public String novoLocal(){
		this.localtrabalho = new Localtrabalho();
		return "formLocaltrabalho";
	}

	public DataModel getTodos(){
		return model = new ListDataModel(localtrabalhoDao.todos());
	}
	
	public Localtrabalho getLocaltrabalhoParaEditarExcluir(){
		Localtrabalho localtrabalho = (Localtrabalho)model.getRowData();
		return localtrabalho;
	}
	
	public String editar(){
		setLocaltrabalho(getLocaltrabalhoParaEditarExcluir());
		return "sucesso";
	}
	
	public String salvar(){
		if (localtrabalho.getIdlocaltrabalho()==null){
			localtrabalhoDao.salvar(localtrabalho);
		}else{
			localtrabalhoDao.atualizar(localtrabalho);
		}
		return "sucesso";
	}
	
	public String excluir(){
		Localtrabalho localtrabalho = getLocaltrabalhoParaEditarExcluir();
		localtrabalhoDao.excluir(localtrabalho);
		return null;
	}
	
	public void escolheLocal(ActionEvent event){
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter)link.findComponent("editId");
		Long id = (Long)param.getValue();
		
		//this.localtrabalho = this.getTodos().get(id.intValue()-1);
	}
}

Meu bean tá assim:

package br.org.creapi.entities;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "localtrabalho")
public class Localtrabalho implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer idlocaltrabalho;
	private String nomeempresa;
	private Set<Profissional> profissionals;

	public Localtrabalho() {
	}

	public Localtrabalho(Integer idlocaltrabalho) {
		this.idlocaltrabalho = idlocaltrabalho;
	}

	public Localtrabalho(Integer idlocaltrabalho, String nomeempresa,
			Set<Profissional> profissionals) {
		this.idlocaltrabalho = idlocaltrabalho;
		this.nomeempresa = nomeempresa;
		this.profissionals = profissionals;
	}

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name = "idlocaltrabalho", unique = true, nullable = false)
	public Integer getIdlocaltrabalho() {
		return this.idlocaltrabalho;
	}

	public void setIdlocaltrabalho(Integer idlocaltrabalho) {
		this.idlocaltrabalho = idlocaltrabalho;
	}

	@Column(name = "nomeempresa", length = 60)
	public String getNomeempresa() {
		return this.nomeempresa;
	}

	public void setNomeempresa(String nomeempresa) {
		this.nomeempresa = nomeempresa;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "localtrabalho")
	public Set<Profissional> getProfissionals() {
		return this.profissionals;
	}

	public void setProfissionals(Set<Profissional> profissionals) {
		this.profissionals = profissionals;
	}

}

e o erro é:

Me ajudem por favor.

4 Respostas

Leozin

É que a variável localtrabalho está nula, por isso que ele dá esse erro. Ele tenta acessar uma propriedade de um objeto nulo.

Primeiro tente consertar isso, se não conseguir, poste o teu faces-config.xml e o teu applicationContext.xml que daí eu te mostro como setar essa propriedade por injeção de dependencia no Spring.

Ps. caraca, como to velho, com 24 anos e já me sinto um idoso vendo a galera trabalhando com JSF 2 rsrs

F

Oi Leo, muito obrigado pela atenção, depois de pesquisar bastante, vi q o pessoal fala muito nesses casos sobre a não inicialização do objeto, então seguindo outros tópicos fiz o seguinte:
na linha do controller:

private Localtrabalho localtrabalho;

ficou assim:

private Localtrabalho localtrabalho = new Localtrabalho();

o erro não aparece mais, mas, acontece outra coisa, no datatable quando clico em Alterar ou Excluir, ele sempre pega o primeiro da lista e não o q eu cliquei.

disponibilizarei o faces-config e o applicationContext logo pra ser analisado:

applicationContext

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="sygec" />
	</bean>
	<context:component-scan base-package="br.org.creapi.controller" />
	<context:annotation-config />
	<!--
		<bean
		class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"
		/>
	-->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	<tx:annotation-driven />
	<bean id="LocaltrabalhoDao" class="br.org.creapi.impl.LocaltrabalhoDaoImpl" />
</beans>

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
 <managed-bean>
  <managed-bean-name>localtrabalhoController</managed-bean-name>
  <managed-bean-class>br.org.creapi.controller.LocaltrabalhoController</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <navigation-rule>
  <from-view-id>/*</from-view-id>
  <navigation-case>
   <from-outcome>formLocaltrabalho</from-outcome>
   <to-view-id>/formLocaltrabalho.xhtml</to-view-id>
  </navigation-case>
 </navigation-rule>
 <navigation-rule>
  <from-view-id>/formLocaltrabalho.xhtml</from-view-id>
  <navigation-case>
   <from-outcome>formLocaltrabalho</from-outcome>
   <to-view-id>/formLocaltrabalho.xhtml</to-view-id>
  </navigation-case>
 </navigation-rule>
 <application>
  <!-- Configura o Apache MyFaces Trinidad para utilizar o UploadFile -->
  <default-render-kit-id>org.apache.myfaces.trinidad.core</default-render-kit-id>
  <!-- Configura o Spring 2.5 para trabalhar com JSF 1.2 -->
  <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
  <message-bundle>br.org.creapi.bundle.Bundle</message-bundle>
 </application>
 <!--
		<application> <view-handler> com.sun.facelets.FaceletViewHandler
		</view-handler> <locale-config/> </application>
	-->
 <factory/>
</faces-config>
Leozin

Olá fajo

Vou dar a solução que eu usava no JSF 1.1/1.2:

Se você usar a lista, o ideal é você passar o id pro teu Backing Bean. Como fazer isso?

1- Dentro dos links de Alterar ou excluir, adicione a seguinte tag
<f:param name=“idLocalTrabalho” value="#{l.idlocaltrabalho}" />

que ficaria assim:

<h:commandLink value="Excluir" action="#{localtrabalhoController.excluir}"> <f:param name="idLocalTrabalho" value="#{l.idlocaltrabalho}" /> </h:commandLink>

2- Dentro do teu código (por exemplo, excluir), coloque o seguinte código:

FacesContext context = FacesContext.getCurrentInstance(); Integer value = (Integer) context.getExternalContext().getRequestMap().get("idLocalTrabalho");

Agora é simples, com o id em mãos no teu método de excluir, tu faz o que quiser.

Abraço

F

Obrigado Leo, consegui resolver, o problema tava nessa linha:

rendered="#{not empty localtrabalhoController.todos}"

tirei ela e pronto.

Criado 24 de março de 2010
Ultima resposta 26 de mar. de 2010
Respostas 4
Participantes 2