2
respostas

Dificuldade na configuração do ambiente

Segui todo o passo a passo da configuração do ambiente, porem ao clicar no botão gravar recebo vários erros, segue abaixo o xhtml e a classe livroBean:


livro.xhtml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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">
<h:body>
    <h1>Novo Livro</h1>
    <h:form>
        <fieldset>
            <legend> Dados do Livro</legend>
            <h:panelGrid columns="2">
                <h:outputLabel value="Titulo:" for="titulo" />
                <h:inputText id="titulo" value="#{livrobean.titulo}"/>
                <h:outputLabel value="ISBN:" for="isbn" />
                <h:inputText id="isbn" value="#{livrobean.isbn}"/>
                <h:outputLabel value="Preço:" for="preco" />
                <h:inputText id="preco" value="#{livrobean.preco}"/>
                <h:outputLabel value="Data de Lancamento:" for="dataLancamento" />
                <h:inputText id="dataLancamento" value="#{livrobean.dataLancamento}"/>
                <h:commandButton value="Gravar" action="#{livroBean.gravar()}"/>
            </h:panelGrid>
        </fieldset>
    </h:form>

</h:body>



</html>

Classe livroBean

package br.com.caelum.livraria.bean;

import javax.faces.bean.ManagedBean;

@ManagedBean public class livroBean { private String titulo; private String isbn; private double preco; private String dataLancamento;

public String getTitulo() { return titulo; }

public void setTitulo(String titulo) { this.titulo = titulo; }

public String getIsbn() { return isbn; }

public void setIsbn(String isbn) { this.isbn = isbn; }

public double getPreco() { return preco; }

public void setPreco(double preco) { this.preco = preco; }

public String getDataLancamento() { return dataLancamento; }

public void setDataLancamento(String dataLancamento) { this.dataLancamento = dataLancamento; }

public void gravar() { System.out.println("Gravando Livro" + this.titulo); } }

```

Erros recebidos ao clicar no botão gravar:

HTTP Status 500 - /livro.xhtml @12,59 value="#{livrobean.titulo}": Target Unreachable, identifier 'livrobean' resolved to null

type Exception report

message /livro.xhtml @12,59 value="#{livrobean.titulo}": Target Unreachable, identifier 'livrobean' resolved to null

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: /livro.xhtml @12,59 value="#{livrobean.titulo}": Target Unreachable, identifier 'livrobean' resolved to null javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause

javax.el.PropertyNotFoundException: /livro.xhtml @12,59 value="#{livrobean.titulo}": Target Unreachable, identifier 'livrobean' resolved to null com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100) com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95) javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030) javax.faces.component.UIInput.validate(UIInput.java:960) javax.faces.component.UIInput.executeValidate(UIInput.java:1233) javax.faces.component.UIInput.processValidators(UIInput.java:698) javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) javax.faces.component.UIForm.processValidators(UIForm.java:253) javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1170) com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.82 logs.

Se alguém puder me ajudar eu agradeço, no aguardo!!

2 respostas

Olá Gabriel,

Primeiramente, sua classe deve começar com letra Maiuscula, LivroBean.

Após ajustar o nome da classe, a referencia dela no seu xhtml deve seguir o seguinte padrao livroBean, conforme o exemplo abaixo:

<h:inputText id="titulo" value="#{livroBean.titulo}"/>

No xhtml que voce postou, a referencia ao bean está toda em minúsculo, repare que as referencias sao case sensitive, logo voce deve utilizar o padrao que expliquei acima.

Prezado Gabriel, Em primeiro lugar, sua classe LivroBean foi declarada com o nome fora do padrão. O correto aqui seria algo como

public class LivroBean

Em segundo lugar, o Java e por consequência o JSF também, seguem o padrão camelCase e a linguagem é Case Sensitive. Isso que dizer que , conforme bem esclarecido pelo colega Denis, na expression language do seu xhtml você deve se referir a sua classe chamando algo como:

livroBean.nome

Isso é o padrão camelCase e a menos que você defina outro nome manualmente para seu bean o JSF não o reconhecerá pelo nome livrobean todo minúsculo pois esse padrão não é aceito pelo JSF. Case sensitive significa que livrobean é diferente de livroBean. Ou seja, Java faz distinção de maiúsculas e minúsculas. Recomendo fortemente que você dê uma estudada nesses padrões Java. Aqui na Alura tem uns cursos iniciantes que são bem práticos e rápidos. Ah, por fim, não esqueça de inserir seu código dentro da tag de “inserir código-fonte” pois assim o mesmo fica formatado e legível, o que facilita na hora de ajudar. Abraços e bons estudos.