Problema com action JSF

Olá

Mais uma vez estou aqui pedindo a ajuda de vocês com o JSF: eu criei uma pagina para cadastrar um usuário e senha apenas, então no meu backBean, eu coloquei o metodo inserir() que foi chamado em um <h:commandButton> com a action="#{usuario.inserir}", e tudo devidamente mapeado no FacesConfig. Porem estou retornando o seguinte erro:

[quote]HTTP Status 500 -

type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: #{usuario.inserir}: javax.el.MethodNotFoundException: Method not found: br.com.wmsolucoes.netbuilder.entidade.Usuario@1979eb4.inserir()
root cause

javax.faces.FacesException: #{usuario.inserir}: javax.el.MethodNotFoundException: Method not found: br.com.wmsolucoes.netbuilder.entidade.Usuario@1979eb4.inserir()
root cause

javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: Method not found: br.com.wmsolucoes.netbuilder.entidade.Usuario@1979eb4.inserir()
root cause

javax.el.MethodNotFoundException: Method not found: br.com.wmsolucoes.netbuilder.entidade.Usuario@1979eb4.inserir()
note The full stack traces of the exception and its root causes are available in the Sun GlassFish Enterprise Server v2.1 logs.[/quote]

Eis os trechos do códigos correspondente:

FacesConfig.xml

[code]<?xml version='1.0' encoding='UTF-8'?>

<navigation-rule>
   <from-view-id>/index.jsp</from-view-id>
   <navigation-case>
      <from-outcome>cadUsuario</from-outcome>
   <to-view-id>/cadUsuario.jsp</to-view-id>
   </navigation-case>
usuario br.com.wmsolucoes.netbuilder.entidade.Usuario session [/code]

Usuario.java

[code]…
public String inserir(Usuario u) {
UsuarioDAO dao = new UsuarioDAO();
if (dao.save(u)) {
resultado = SUCESSO;
return resultado;
} else {
resultado = FALHA;
return resultado;
}

}
…[/code]

[b]cadUsuario.jsp

[code]<%@taglib prefix=“f” uri=“http://java.sun.com/jsf/core”%>
<%@taglib prefix=“h” uri=“http://java.sun.com/jsf/html”%>

Cadastrar Usuario

[/code]

Alguem poderia me ajudar e ensinar o que estou fazendo de errado ???

Obrigado

Cara, nao sou muito fera em Jsf mas posso dar umas dicas, vamos la:

  1. Defina bem oque e um Bean e oque e um BackBean:
    Vc criou e mapeou um backBean como Usuario.java e esta tentando inserir um bean Usuario
    Defina seu backBean como UsuarioManager por exemplo. Cria sua entidade como POJO, apenas com seus atributos e seus respectivos Gets and Sets

[code]
public class UsuarioManager{

private Usuario usuario;

public void setUsuario(Usuario usuario) {

	this.usuario = usuario;

}



public Usuario getUsuario() {

	return usuario;

}

public String inserir() {
UsuarioDAO dao = new UsuarioDAO();
if (dao.save(usuario)) {
resultado = SUCESSO;
return resultado;
} else {
resultado = FALHA;
return resultado;
}

} [/code]

la no seu faces-config mapeie ele como usuarioManager, sei que a principio parece uma coisa superficial, porem definir bem oque os objetos executam em seu projeto sera de extrema importancia.

Entendi ! Vou tentar fazer isso, e posto o resultado para voces !

Uma duvida, esse ManagedBean seria como um Controller ?

Seu BackBean ou ManageBean mapeia as acoes da sua pagina, ou seja, ele e o meio de campo entre seu bean e sua pagina Jsf

Olá!

Seu método invocado pela jsp é o inserir. Até onde sei, um método invocado via action (no seu commandButton) deve ser da seguinte forma:

public String nomeMetodo(){
   return "";
}

Como seu método inserir no Managed Bean está recebendo um parâmetro (Usuário u), então ele não vai encontrar um método que siga o “formato” exigido.

O erro grave que você está cometendo é tentar salvar o ManagedBean no seu banco. Você deve criar uma entidade Usuario, com os dados (sei lá, nome, idade, cidade, etc). Então, criar um MBean pra tela (e.g, MBeanCadastroUsuario). Nele, você instancia um objeto da entidade Usuario. Ao chamar o método inserir, você salva esse objeto criado dentro do seu MBean. Algo assim:

   public class MBeanCadastroUsuario {
      Usuario u;

      public String inserir(){
         UsuarioDAO dao = new UsuarioDAO();  
         if (dao.save(u)) {  
            resultado = SUCESSO;  
            return resultado;   
         } else {  
            resultado = FALHA;  
            return resultado;  
         } 
   }

No seu jsp, coloca assim para inserir o nome diretamente em u, dentro do seu bean (lembrando que tem que criar o getter e o setter dos atributos na sua entidade Usuario):

   <h:inputText value="mBeanCadastroUsuario.u.nome" />

Conseguiu entender algo do que escrevi? Qualquer coisa, pergunta ai.

Abraço

Cara, entendi sim, porem lendo sua explicação me surgiu uma pequena dúvida, na qual ficaria grato se pudesse me responder:

Vamos la, vamos supor que eu estou desenvolvendo um formulário para cadastro de Usuario, então eu tenho lá o meu POJO Usuario com seus getters e setters, lembrando que eu uso anotacoes para o Hibernate nessa classe, dai eu devo ter o meu UsuarioManaged que vai ser o interlocutor entre essa entidade e o meu jsp. ate ai beleza. A dúvida é:

Quando eu referencio os campos a serem persistidos la no meu jsp, por exemplo #{usuario.nome}, {#usuario.senha}, eu devo referenciar a partir de agora #{usuariobean.nome}, #{usuariobean.senha} ? E esse UsuarioManaged eu devo criar os mesmos atributos com getters e setters do Usuario (POJO) ?

Cara, isso ficaria assim:


"#{usuarioManager.usuario.nome}"

Nao precisa rescrever gets and sets para todos os atributios do seu bean, somente o objeto que estara sendo referenciado

   public class UsuarioManager{  
     
     
   private Usuario usuario;  
     
       public void setUsuario(Usuario usuario) {  
     
           this.usuario = usuario;  
     
       }  
     
     
     
       public Usuario getUsuario() {  
     
           return usuario;  
     
       }  

Outra coisa, faz um tempo que eu nao desenvolvo com jsf, se nao me engano vc tem que inicializar o seu objeto no construtor

public managerUsuario(){
       usuario = new Usuario();
}

Beleza, eu vou fazer meus testes aqui e posto o resultado !!!

Obrigado pelas respostas e explicações heim !

Um Abraco !

Olá!

Sim, você terá 2 arquivos .java: um com o seu Managed Bean e outro com a sua entidade. Aqui nós usamos outro ainda, que chamamos de VO - View Object (também conhecido como TO, entre outros). Esse bean possui apenas atributos, mas é utilizado apenas pela interface (pelas telas jsp) e pelos beans. Não usamos as entidades diretamente na tela, pois há poluição de dados. Esmiuçando…

Num crud normal, podemos excluir registros. Guardamos os dados da tabela num VO, que tem os mesmos campos da entidade. Mas, além disso, precisamos controlar, por exemplo, quem deve ser excluído, ou criar um método que imprima a data num formato específico. Essa variável booleana pra controle da exclusão, e esse método que imprime a data no padrão desejado são úteis apenas na interface. Na entidade você não quer guardar se o cara vai ser excluído ou não, nem vai guardar a data em formatos específicos (as datas são guardadas como Date padrão do banco).

Na entidade, mantemos também dois métodos: entity2VO e vo2Entity, que faz justamente a cópia dos dados da entidade para o VO, que será usado na interface, o que mantém a confiabilidade de que o VO tem os dados corretos. Quando deseja salvar, o vo2entity faz o inverso, seta os dados do vo direto numa instância da entidade, prontinha pra salvar no banco. Enfim, isso é uma sugestão. Apesar de parecer trabalho duplicado, quando você se depara como casos como os que citei acima fica muito melhor de tratar, e bem mais claro.

Voltando ao seu problema…

Você, ao instanciar no seu MBean a entidade Usuario, deve chamá-la diretamente:

 #{mBeanCadastroUsuario.usuario.nome}

É como se você estivesse acessando os objetos diretamente. Experimenta tentar acessar essa sua “variável” usuario de dentro de qualquer método do seu MBean. Você faria isso:

 this.getUsuario.getNome();

É isso que o jsp “faz”, vai acessando o seu bean (this), sua variável (usuario), e o atributo dentro dele (nome). Capice?

Quanto ao que o lucianotome afirmou, você precisa mesmo inicializar seu objeto, mas não precisa ser no construtor (aliás, isso pode trazer MUITOS problemas se seu jsp for do tipo session, por exemplo, ja que ele vai entrar no construtor toda hora e vai inicializar seu objeto novamente, ocasionando em perda de dados). Tente evitar o uso de construtor devido a esses casos. Não há problema de instanciar na própria declaração.

 Usuario usuario = new Usuario();

Abraço

Pessoal eu estou com o mesmo problema sou iniciante em JSF será que alguem pode me ajudar?

meu Bean:

package br.bean;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@SessionScoped
@ManagedBean(name="teste")
public class Teste {
	
	private String nome;

	public String getNome() {
		nome = "Andre";
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public String teste(){
		return "testes.faces";
	}

}

minha pagina:

<?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">
<body>
<div style="width:100%;font-size:36px;line-height:48px;background-color:navy;color:white">My Facelet Application</div>
	<h:outputText value="#{teste.nome}"/>
	<h:form>
		<h:inputText value="#{teste.nome}"/>
		<h:commandButton action="#{teste.teste}" value="Enviar"/>
	</h:form>
</body>
</html>

meu web.XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 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-app_3_0.xsd">
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.faces</welcome-file>
    </welcome-file-list>
</web-app>

será que alguem consegue me ajudar?

Obrigado!