Problema com JSF... (erro no .jsp)

38 respostas
X
Ta o eclipse ta acusando erro no meu jsp mais eu não sei o motivo... Meu jsp é esse.
<%@ page contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<html>
<head>
<title>Cadastro de conta</title>
<link rel="stylesheet" type="text/css" href="../css/estilo.css" />
</head>
<body>
	<f:view>
		<h:form id="frm">
			<h1>
				<h:outputText value="Cadastro de conta" />
			</h1>
			<h:messages layout="table" showSummary="true" showDetail="false"
				globalOnly="true" styleClass="msgErro" infoClass="msgInfo"
				style="font-weight: bold" />
			<h:panelGrid columns="2">
				<h:outputLabel value="Código:"
					rendered="#{cadastroContaBean.contaEdicao.id!= null}" />
				<h:panelGroup rendered="#{cadastroContaBean.contaEdicao.id!= null}">
					<h:inputText id="codigo" size="10"
						value="#{cadastroContaBean.contaEdicao.id}"
						label="Código da conta" disabled="true" />
					<h:message for="codigo" showSummary="true" showDetail="false"
						styleClass="msgErro" />
				</h:panelGroup>
				<h:outputLabel value="Pessoa:" />
				<h:panelGroup>
					<h:selectOneMenu id="pessoa"
						value="#{cadastroContaBean.contaEdicao.pessoas}" label="Pessoa"  ERRO AKI
						required="true">
						<f:selectItems value="#{cadastroContaBean.pessoas}" />
					</h:selectOneMenu>
					<h:message for="pessoa" showSummary="true" showDetail="false"
						styleClass="msgErro" />
				</h:panelGroup>
				<h:outputLabel value="Tipo:" />
				<h:panelGroup>
					<h:selectOneRadio id="tipo"
						value="#{cadastroContaBean.contaEdicao.tipo}"
						label="Tipo da conta" required="true">
						<f:selectItems value="#{cadastroContaBean.tiposLancamentos}" />
					</h:selectOneRadio>
					<h:message for="tipo" showSummary="true" showDetail="false"
						styleClass="msgErro" />
				</h:panelGroup>
				<h:outputLabel value="Descrição:" />
				<h:panelGroup>
					<h:inputText id="descricao" size="40" maxlength="150"
						value="#{cadastroContaBean.contaEdicao.descricao}" required="true"
						label="Descrição" />
					<h:message for="descricao" showSummary="true" showDetail="false"
						styleClass="msgErro" />
				</h:panelGroup>
				<h:outputLabel value="Valor:" />
				<h:panelGroup>
					<h:inputText id="valor" size="12" maxlength="10"
						value="#{cadastroContaBean.contaEdicao.valor}" required="true"
						label="Valor">
						<f:convertNumber minFractionDigits="2" />
					</h:inputText>
					<h:message for="valor" showSummary="true" showDetail="false"
						styleClass="msgErro" />
				</h:panelGroup>
				<h:outputLabel value="Data vencimento:" />
				<h:panelGroup>
					<h:inputText id="dataVencimento" size="12" maxlength="10"
						value="#{cadastroContaBean.contaEdicao.dataVencimento}"
						required="true" label="Data vencimento">
						<f:convertDateTime pattern="dd/MM/yyyy" />
					</h:inputText>
					<h:message for="dataVencimento" showSummary="true"
						showDetail="false" styleClass="msgErro" />
				</h:panelGroup>
				<h:outputLabel value="Data baixa:" />
				<h:panelGroup>
					<h:inputText id="dataBaixa" size="12" maxlength="10"
						value="#{cadastroContaBean.contaEdicao.dataBaixa}"
						label="Data baixa">
						<f:convertDateTime pattern="dd/MM/yyyy" />
					</h:inputText>
					<h:message for="dataBaixa" showSummary="true" showDetail="false"
						styleClass="msgErro" />
				</h:panelGroup>
				<h:panelGroup />
				<h:panelGroup>
					<h:commandButton value="Salvar"
						actionListener="#{cadastroContaBean.salvar}" styleClass="botao" />
					<h:commandButton value="Cancelar" action="menu" immediate="true"
						styleClass="botao" />
				</h:panelGroup>
			</h:panelGrid>
		</h:form>
	</f:view>
</body>
</html>
Minha classe:
package com.algaworks.dwjsf.financeiro.visao;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import com.algaworks.dwjsf.financeiro.dominio.Conta;
import com.algaworks.dwjsf.financeiro.dominio.Pessoa;
import com.algaworks.dwjsf.financeiro.dominio.TipoConta;
import com.algaworks.dwjsf.financeiro.negocio.ContaService;
import com.algaworks.dwjsf.financeiro.negocio.PessoaService;
import com.algaworks.dwjsf.financeiro.negocio.RegraNegocioException;

public class CadastroContaBean {
	private Conta contaEdicao;
	private List<SelectItem> tiposContas;
	private List<SelectItem> pessoas;

	public String inicializar() {
		this.contaEdicao = new Conta();
		this.tiposContas = null;
		this.pessoas = null;
		return "cadastroConta";
	}

	public void salvar(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new ContaService().salvar(this.contaEdicao);
			this.contaEdicao = new Conta();
			FacesMessage msg = new FacesMessage("Conta salva com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
		} catch (RegraNegocioException e) {
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, e
							.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage(
					"Erro inesperado ao salvar conta!");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}
	}

	public List<SelectItem> getPessoas() {
		if (this.pessoas == null) {
			this.pessoas = new ArrayList<SelectItem>();
			List<Pessoa> pessoas = new PessoaService().listarTodas();
			this.pessoas.add(new SelectItem(null, "Selecione"));
			for (Pessoa pessoa : pessoas) {
				this.pessoas.add(new SelectItem(pessoa, pessoa.getNome()));
			}
		}
		return this.pessoas;
	}

	public List<SelectItem> getTiposLancamentos() {
		if (this.tiposContas == null) {
			this.tiposContas = new ArrayList<SelectItem>();
			for (TipoConta tipo : TipoConta.values()) {
				this.tiposContas.add(new SelectItem(tipo, tipo.toString()));
			}
		}
		return tiposContas;
	}

	public Conta getContaEdicao() {
		return contaEdicao;
	}

	public void setContaEdicao(Conta contaEdicao) {
		this.contaEdicao = contaEdicao;
	}

}

Alguem sabe oq é o problema???
ps: o eclipse acusa erro na linha 32 do jsp

Obg

38 Respostas

M

Execute em modo de debug, e veja onde o erro está sendo lançado. :wink:

X

O erro é esse:

SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! The element type "navigation-rule" must be terminated by the matching end-tag "</navigation-rule>". at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:214) at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:200) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) at org.apache.catalina.core.StandardService.start(StandardService.java:525) at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) at org.apache.catalina.startup.Catalina.start(Catalina.java:595) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Caused by: org.xml.sax.SAXParseException: The element type "navigation-rule" must be terminated by the matching end-tag "</navigation-rule>". at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388) at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1414) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1749) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2938) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284) at com.sun.faces.config.ConfigManager$ParseTask.getDocument(ConfigManager.java:445) at com.sun.faces.config.ConfigManager$ParseTask.call(ConfigManager.java:415) at com.sun.faces.config.ConfigManager$ParseTask.call(ConfigManager.java:372) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619)

Ps: não sei usar bem o debug eu coloco o ponto na linha do erro?? Eu coloquei umas duas linhas depois…

X

O erro que postei acima já ajeitei… Fui mexer no faces-config.xml e esquecendo de fecha </ >, mais ja ta ok
O erro agora é esse:

SEVERE: Servlet.service() for servlet Faces Servlet threw exception java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526) at org.hibernate.cfg.AnnotationConfiguration.<clinit>(AnnotationConfiguration.java:56) at com.algaworks.dwjsf.financeiro.util.HibernateUtil.<clinit>(HibernateUtil.java:11) at com.algaworks.dwjsf.financeiro.negocio.PessoaService.listarTodas(PessoaService.java:24) at com.algaworks.dwjsf.financeiro.visao.CadastroContaBean.getPessoas(CadastroContaBean.java:55) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:83) at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:173) at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:200) at org.apache.el.parser.AstValue.getValue(AstValue.java:123) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101) at javax.faces.component.UISelectItems.getValue(UISelectItems.java:141) at com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:283) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:783) at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:280) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:864) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:244) at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:106) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:236) at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:180) at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:127) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:930) at javax.faces.render.Renderer.encodeChildren(Renderer.java:148) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:930) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:933) at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:266) at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:197) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 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:291) 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(Thread.java:619)

J

Faltando jar do Apache Commons Logging. Da uma olhada nas libs do seu projeto.

X

Eu coloquei todos os jars que tem na apotila ta tudo igual ate as versões, mais a apostila pode está com erro ( super comum…) sabe que é o nome desse jar???

X

Eu coloque o commons-logging-1.1.1.jar
e o erro mudo agora é:

org.apache.jasper.el.JspELException: /contas/cadastroConta.jsp(34,6) '#{cadastroContaBean.pessoas}' Error reading 'pessoas' on type com.algaworks.dwjsf.financeiro.visao.CadastroContaBean
	org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:107)
	javax.faces.component.UISelectItems.getValue(UISelectItems.java:141)
	com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:283)
	com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:783)
	com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:280)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:864)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:244)
	com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:106)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:236)
	com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:180)
	com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:127)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:930)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:148)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:930)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:933)
	com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:266)
	com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:197)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
H

xandi_m5:
Eu coloque o commons-logging-1.1.1.jar
e o erro mudo agora é:

org.apache.jasper.el.JspELException: /contas/cadastroConta.jsp(34,6) '#{cadastroContaBean.pessoas}' Error reading 'pessoas' on type com.algaworks.dwjsf.financeiro.visao.CadastroContaBean org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:107) javax.faces.component.UISelectItems.getValue(UISelectItems.java:141) com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:283) com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:783) com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:280) javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:864) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:244) com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:106) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840) com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:236) com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:180) com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:127) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840) javax.faces.component.UIComponent.encodeAll(UIComponent.java:930) javax.faces.render.Renderer.encodeChildren(Renderer.java:148) javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840) javax.faces.component.UIComponent.encodeAll(UIComponent.java:930) javax.faces.component.UIComponent.encodeAll(UIComponent.java:933) com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:266) com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:197) com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)

Você está utilizando uma classe sua em uma combo (select)? É isso?

Se for, você irá precisar ter um converter. Nesse post eu mostro como fazer: JSF: Converter e Bean Auto Complete.

V

troca a extensão de .jsp para .xhtml

J

O erro que está acontecendo agora é pela falta de um converter. Sugiro dar uma estudada melhor nesses exemplos que vc está tentando fazer.

X
jakefrog:
xandi_m5:
Eu coloque o commons-logging-1.1.1.jar e o erro mudo agora é:
org.apache.jasper.el.JspELException: /contas/cadastroConta.jsp(34,6) '#{cadastroContaBean.pessoas}' Error reading 'pessoas' on type com.algaworks.dwjsf.financeiro.visao.CadastroContaBean
	org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:107)
	javax.faces.component.UISelectItems.getValue(UISelectItems.java:141)
	com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:283)
	com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:783)
	com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:280)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:864)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:244)
	com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:106)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:236)
	com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:180)
	com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:127)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:930)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:148)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:840)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:930)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:933)
	com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:266)
	com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:197)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)

Você está utilizando uma classe sua em uma combo (select)? É isso?

Se for, você irá precisar ter um converter. Nesse post eu mostro como fazer: JSF: Converter e Bean Auto Complete.

Eu ja tenho um:
package com.algaworks.dwjsf.financeiro.conversores;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import com.algaworks.dwjsf.financeiro.dominio.Pessoa;
import com.algaworks.dwjsf.financeiro.negocio.PessoaService;

public class PessoaConverter implements Converter {
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) throws ConverterException {
		if (value == null) {
			return null;
		}
		return new PessoaService().pesquisarPorId(Long.parseLong(value));
	}

	public String getAsString(FacesContext context, UIComponent component,
			Object object) throws ConverterException {
		if (object == null) {
			return null;
		}
		Pessoa pessoa = (Pessoa) object;
		return pessoa.getId().toString();
	}
}
No meu faces-config.xml: O eclipse acusa erro ak:
<converter>
		<converter-for-class>java.lang.Enum</converter-for-class>
		<converter-class>com.algaworks.dwjsf.financeiro.conversores.EnumConverter</converter-class>
</converter>
Diz o seguinte:
Class java.lang.Enum must be concrete (not abstract)
Pode ser por causa disso o problema?? Como resolvo?? ps: só vi isso agora... :/ Obg
H

Vc ta colocando qual enum no seu select one?

Pq lá não tinha nenhum.

J

Você precisa registrar a sua classe e o converter dela. No caso o que está registrado no seu faces é a classe java.lang.Enum (aqui deve ser sua classe pessoa) e a classe do converter, que deveria ser essa que vc postou, se estiver correta ( não parei para olhar seu código).
Novamente dou a dica de estudar direito o material, a impressão que dá é que você não leu ( ou entendeu ) como funciona o material e já está tentando implementar algo.

X
jaziel.rc:
Você precisa registrar a sua classe e o converter dela. No caso o que está registrado no seu faces é a classe java.lang.Enum (aqui deve ser sua classe pessoa) e a classe do converter, que deveria ser essa que vc postou, se estiver correta ( não parei para olhar seu código). Novamente dou a dica de estudar direito o material, a impressão que dá é que você não leu ( ou entendeu ) como funciona o material e já está tentando implementar algo.

Eu já tinha registrado a classe pessoas e seu converter, eu postei só a parte do erro... ;;

Eu li tudo, entendi umas coisas e e outras não...

To tentando fazer a atividade para mim tentar entender a base de problemas... Eu fiz boa parte sem olhar, mais deu erro tentei corrigir e nada. Ai copiei e colei e outro erro... que é esse que eu to mostrando...

Meu faces-config.xml completo:
<?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>cadastroContaBean</managed-bean-name>
		<managed-bean-class>
			com.algaworks.dwjsf.financeiro.visao.CadastroContaBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	<managed-bean>
		<managed-bean-name>consultaContaBean</managed-bean-name>
		<managed-bean-class>
			com.algaworks.dwjsf.financeiro.visao.ConsultaContaBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	<navigation-rule>
		<navigation-case>
			<from-outcome>cadastroConta</from-outcome>
			<to-view-id>/contas/cadastroConta.jsp</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>consultaConta</from-outcome>
			<to-view-id>/contas/consultaConta.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
	<navigation-rule>
		<navigation-case>
			<from-outcome>menu</from-outcome>
			<to-view-id>/menu.jsp</to-view-id>
			<redirect />
		</navigation-case>
	</navigation-rule>
	<converter>
		<converter-for-class>java.lang.Enum</converter-for-class>
		<converter-class>com.algaworks.dwjsf.financeiro.conversores.EnumConverter</converter-class>
	</converter>
	<converter>
		<converter-for-class>com.algaworks.dwjsf.financeiro.dominio.Pessoa</converter-for-class>
		<converter-class>
			com.algaworks.dwjsf.financeiro.conversores.PessoaConverter</converter-class>
	</converter>


</faces-config>
H

Vc está utilizando JSF 2.0?

Se sim. Enum não precisa de converter (se não me engano).

X

jakefrog:
Vc está utilizando JSF 2.0?

Se sim. Enum não precisa de converter (se não me engano).


Estou sim!
E como eu faço?

Na apostila diz isso:
Toda enumeração herda implicitamente da classe Enum. Para deixar nosso
conversor genérico e pronto para qualquer enumeração que possa surgir no futuro em nosso
projeto, registramo-lo para o tipo genérico java.lang.Enum no arquivo “faces-config.xml”.

<converter> <converter-for-class>java.lang.Enum</converter-for-class> <converter-class>com.algaworks.dwjsf.financeiro.conversores.EnumConverter</converter-class> </converter>

H

Faz o seguinte, apaga essa linha do xml, onde vc declara o converter e vai usando e veja c vai dar pau em algum selectOne que tenha um enum (não classe normal, apenas enum).

X

Eu fiz isso, o selectOne (pessoa) continua com erro…
O erro tb é esse:

(Phase ID: RENDER_RESPONSE 6, View ID: /contas/cadastroConta.jsp) Exception thrown during phase execution: javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@c1b161] 28/11/2011 16:00:40 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet Faces Servlet threw exception org.hibernate.MappingException: Could not determine type for: com.algaworks.dwjsf.financeiro.dominio.Pessoa, at table: conta, for columns: [org.hibernate.mapping.Column(nome)]

H

Coloca aí apenas o código do seu select. Como está agora.

X

Ta aki:

<h:selectOneMenu id="pessoa" value="#{cadastroContaBean.contaEdicao.pessoa}" label="Pessoa" required="true"> <f:selectItems value="#{cadastroContaBean.pessoas}" /> </h:selectOneMenu>

J

Veja que o erro agora mudou. Ele se refere ao hibernate, parece que o mapeamento não está definido corretamente. Poste o código das classes para ajudar.

X
jaziel.rc:
Veja que o erro agora mudou. Ele se refere ao hibernate, parece que o mapeamento não está definido corretamente. Poste o código das classes para ajudar.
Classe Pessoa:
package com.algaworks.dwjsf.financeiro.dominio;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
// diz que a classe é uma entidade
@Table(name = "pessoa")
// especifica que a entidade representa uma tabela específica do banco de dados,
// descrita na propriedade name.
public class Pessoa {
	private Long id;
	private String nome;

	
	/*
	 * Id e GeneratedValue são usadas para declarar o identificador do banco de
	 * dados, e esse identificador deve ter um valor gerado no momento de
	 * inserção (auto-incremento)
	 */
	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	@Column(name = "nome")
	public String getNome() {
		return nome;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Pessoa other = (Pessoa) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}
Classe Conta:
package com.algaworks.dwjsf.financeiro.dominio;

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "conta")
public class Conta {
	private Long id;
	private Pessoa nome;
	private String descricao;
	private BigDecimal valor;
	private TipoConta tipo;
	private Date dataVencimento;
	private Date dataBaixa;

	@Id
	@GeneratedValue
	public Long getId() {
		return id;
	}

	@ManyToOne
	// indica a multiplicidade do relacionamento entre contas e pessoas e a
	// anotação
	@JoinColumn(name = "pessoa_id")
	// indica que essa relação é conseguida através da coluna especificada na
	// propriedade name
	public void setId(Long id) {
		this.id = id;
	}

	public Pessoa getNome() {
		return nome;
	}

	public void setNome(Pessoa nome) {
		this.nome = nome;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public BigDecimal getValor() {
		return valor;
	}

	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	@Enumerated(EnumType.STRING)
	// foi mapeado com a anotação @Enumerated com EnumType.STRING. Isso é
	// necessário para que o Hibernate entenda que na coluna do banco de dados
	// será gravado o nome da constante da enumeração, e não o número que
	// representa cada opção.
	public TipoConta getTipo() {
		return tipo;
	}

	public void setTipo(TipoConta tipo) {
		this.tipo = tipo;
	}

	@Column(name = "data_vencimento")
	@Temporal(TemporalType.DATE)
	public Date getDataVencimento() {
		return dataVencimento;
	}

	public void setDataVencimento(Date dataVencimento) {
		this.dataVencimento = dataVencimento;
	}

	/*
	 * foram mapeados com:
	 * 
	 * @Column e @Temporal. A anotação @Temporal é útil para definir a precisão
	 * de colunas de data/hora. No caso das duas datas que mapeamos, dizemos que
	 * queremos armazenar apenas a data, e não data/hora.
	 */
	@Column(name = "data_baixa")
	@Temporal(TemporalType.DATE)
	public Date getDataBaixa() {
		return dataBaixa;
	}

	public void setDataBaixa(Date dataBaixa) {
		this.dataBaixa = dataBaixa;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Conta other = (Conta) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}
Classe HibernateUtil:
package com.algaworks.dwjsf.financeiro.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {
	private static SessionFactory sessionFactory;
	static {
		try {
			sessionFactory = new AnnotationConfiguration().configure()
					.buildSessionFactory();
		} catch (Throwable ex) {
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static Session getSession() {
		return sessionFactory.openSession();
	}
}

Só as classes de domínio?? Ou também as outras??

X

Se eu postar o projeto no SkyDriver vcs podem da uma olhada??

ps: Eu sei que é pedir muito, mais não posso continuar a apostila sem saber pq está acorrendo esse problema, pois senão virá uma bola de neve…

H

xandi_m5:
Se eu postar o projeto no SkyDriver vcs podem da uma olhada??
Eu não.

xandi_m5:
Ta aki:

<h:selectOneMenu id="pessoa" value="#{cadastroContaBean.contaEdicao.pessoa}" label="Pessoa" required="true"> <f:selectItems value="#{cadastroContaBean.pessoas}" /> </h:selectOneMenu>

Se você olhar lah no post que eu te passei, ele mostra que não adianta apenas declarar o converter no web.xml e esquê-lo lá. Você tem que declará-lo aí como converterId=“qqq”.

J

O seu mapeamento entre conta e pessoa não está definido corretamente. O atributo nome na classe Conta é uma entidade, e precisa ser definida como (one-to-one, many-to-one ou many-to-many) com as anotações corretas. O Seu mapeamento de many-to-one entre conta e pessoas está no atributo id, por isso está errado, acredito que se colocando esse mapeamento no getNome irá corrigir esse erro.

X
jakefrog:
xandi_m5:
Se eu postar o projeto no SkyDriver vcs podem da uma olhada??
Eu não.
xandi_m5:
Ta aki:
<h:selectOneMenu id="pessoa"
						value="#{cadastroContaBean.contaEdicao.pessoa}" label="Pessoa"
						required="true">
						<f:selectItems value="#{cadastroContaBean.pessoas}" />
					</h:selectOneMenu>
Se você olhar lah no post que eu te passei, ele mostra que não adianta apenas declarar o converter no web.xml e esquê-lo lá. Você tem que declará-lo aí como converterId="qqq".

Fiz isso o erro continua...

package com.algaworks.dwjsf.financeiro.conversores;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

import com.algaworks.dwjsf.financeiro.dominio.Pessoa;
import com.algaworks.dwjsf.financeiro.negocio.PessoaService;
@FacesConverter(value="pessoa_id")
public class PessoaConverter implements Converter {
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) throws ConverterException {
		if (value == null) {
			return null;
		}
		return new PessoaService().pesquisarPorId(Long.parseLong(value));
	}

	public String getAsString(FacesContext context, UIComponent component,
			Object object) throws ConverterException {
		if (object == null) {
			return null;
		}
		Pessoa pessoa = (Pessoa) object;
		return pessoa.getId().toString();
	}
}
<h:selectOneMenu id="pessoa"
		value="#{cadastroContaBean.contaEdicao.pessoa}" label="Pessoa"
		required="true">
		<f:converter converterId="pessoa_id"/>
	      	<f:selectItems value="#{cadastroContaBean.pessoas}" />
</h:selectOneMenu>
Agora fica erro na linha 2 (aqui ja estava antes e na linha 4 que eu coloquei com o ID)
X

Fiz isso o erro continua… :confused:

X

Eu postei no SkyDriver se alguem poder da uma olhada…

https://skydrive.live.com/?cid=d6b369f16014e7e3#cid=D6B369F16014E7E3&id=D6B369F16014E7E3!133

Obrigado

X
Pessoa os outros erros que disse acima ja resolvi... Mais ainda dá erro: :/ O erro agora é:
javax.servlet.ServletException: /contas/cadastroConta.jsp(35,6) '#{cadastroContaBean.pessoas}' Error reading 'pessoas' on type com.algaworks.dwjsf.financeiro.visao.CadastroContaBean
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:277
)

Eu já olhei minha classe CadastroContaBean e não achei erro... Vcs pode ajudar??
O erro da quando entra nos metodos inicializar() e getPessoas(). Mais não sei o que tem de errado...

package com.algaworks.dwjsf.financeiro.visao;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import com.algaworks.dwjsf.financeiro.dominio.Conta;
import com.algaworks.dwjsf.financeiro.dominio.Pessoa;
import com.algaworks.dwjsf.financeiro.dominio.TipoConta;
import com.algaworks.dwjsf.financeiro.negocio.ContaService;
import com.algaworks.dwjsf.financeiro.negocio.PessoaService;
import com.algaworks.dwjsf.financeiro.negocio.RegraNegocioException;

public class CadastroContaBean {
	private Conta contaEdicao;
	private List<SelectItem> tiposContas;
	private List<SelectItem> pessoas;

	public String inicializar() {
		this.contaEdicao = new Conta();
		this.tiposContas = null;
		this.pessoas = null;
		return "cadastroConta";
	}

	public void salvar(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new ContaService().salvar(this.contaEdicao);
			this.contaEdicao = new Conta();
			FacesMessage msg = new FacesMessage("Conta salva com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
		} catch (RegraNegocioException e) {
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, e
							.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage(
					"Erro inesperado ao salvar conta!");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}
	}

	public List<SelectItem> getPessoas() {
		if (this.pessoas == null) {
			this.pessoas = new ArrayList<SelectItem>();
			List<Pessoa> pessoas = new PessoaService().listarTodas();
			this.pessoas.add(new SelectItem(null, "Selecione"));
			for (Pessoa pessoa : pessoas) {
				this.pessoas.add(new SelectItem(pessoa, pessoa.getNome()));
			}
		}
		return this.pessoas;
	}

	public List<SelectItem> getTiposLancamentos() {
		if (this.tiposContas == null) {
			this.tiposContas = new ArrayList<SelectItem>();
			for (TipoConta tipo : TipoConta.values()) {
				this.tiposContas.add(new SelectItem(tipo, tipo.toString()));
			}
		}
		return tiposContas;
	}

	public Conta getContaEdicao() {
		return contaEdicao;
	}

	public void setContaEdicao(Conta contaEdicao) {
		this.contaEdicao = contaEdicao;
	}
}
L

Também estou com este último problema.

X

Vc tb está estudando pela apostila da AlgaWorks???

L

Vc tb está estudando pela apostila da AlgaWorks???

Estou sim cara.
A apostila é muito boa, porém pouca gente postou dúvidas a respeito dela… então fica difícil achar a solução de algumas coisas.

X

Vc tb está estudando pela apostila da AlgaWorks???

Estou sim cara.
A apostila é muito boa, porém pouca gente postou dúvidas a respeito dela… então fica difícil achar a solução de algumas coisas.

…Foi a melhor apostila de JSF que eu ja vi…
Eu tenho a atividade de exemplo usada nas aulas da algaworks se vc quiser é só manda seu e-mail que eu ti envio… OK
ps: a atividade é a finalização da apostila talvez demore um pouco pra vc entender…

L

Vc tb está estudando pela apostila da AlgaWorks???

Estou sim cara.
A apostila é muito boa, porém pouca gente postou dúvidas a respeito dela… então fica difícil achar a solução de algumas coisas.

…Foi a melhor apostila de JSF que eu ja vi…
Eu tenho a atividade de exemplo usada nas aulas da algaworks se vc quiser é só manda seu e-mail que eu ti envio… OK
ps: a atividade é a finalização da apostila talvez demore um pouco pra vc entender…

Também foi a melhor que eu achei.
Cara, quero sim. Pelo menos pra eu ver o que posso estar fazendo de errado quando der algo errado.
Meu email: [email removido]

Obrigado!

X

Vc tb está estudando pela apostila da AlgaWorks???

Estou sim cara.
A apostila é muito boa, porém pouca gente postou dúvidas a respeito dela… então fica difícil achar a solução de algumas coisas.

…Foi a melhor apostila de JSF que eu ja vi…
Eu tenho a atividade de exemplo usada nas aulas da algaworks se vc quiser é só manda seu e-mail que eu ti envio… OK
ps: a atividade é a finalização da apostila talvez demore um pouco pra vc entender…

Também foi a melhor que eu achei.
Cara, quero sim. Pelo menos pra eu ver o que posso estar fazendo de errado quando der algo errado.
Meu email: [email removido]

Obrigado!

Ja mandei…

O

Eu tbm que fhoda

O

Alguem pode enviar para mim tbm, iria ajudar muito [email removido]

Obrigado

L

Se alguém ainda tiver esse código… pode me enviar tbm? Estou com o mesmo problema e não consigo resolver…

[email removido]

L

olá galera, boa tarde!!

poderiam me enviar esse código tbm…estou tenho problemas parecidos com os de vcs e não consigo avançar!!!

acho que o problema todo foi iniciar o projeto com jsf 2.0 e codificar da forma antiga (jsf 1.2)…

e-mail: [email removido]

Criado 28 de novembro de 2011
Ultima resposta 18 de nov. de 2012
Respostas 38
Participantes 9