Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

java.lang.NoSuchMethodError

Boa tarde a todos!

Logo na página de login, ao trocar todos os componentes nativos do JSF por componentes do Primefaces, me deparo com a seguinte Exception ao tentar efetuar o login: java.lang.NoSuchMethodError: org.primefaces.util.ResourceUtils.getComponentResources(Ljavax/faces/context/FacesContext;)Ljava/util/ArrayList;

Se eu tento logar sem email e senha, a renderização de mensagens funciona e avisa quais campos estão faltando. Ao preenche-las, não acontece nada na pagina e a Exception é lançada. Retirando o componente do botão de login e colocando o nativo do JSF, o processo de login volta a funcionar. Creio que algo esteja errado com o AJAX. Alguem poderia por favor me mostrar o caminho para encontrar a solução?

Atenciosamente,

Erik Bagger.

Segue o código do arquivo login.xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<!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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head />
<ui:composition template="_template.xhtml">

    <ui:define name="titulo">
        <p:outputPanel>Login</p:outputPanel>
    </ui:define>

    <ui:define name="conteudo">

        <p:messages globalOnly="true" />

        <h:form id="login">
            <h:panelGrid columns="3">
                <p:fieldset legend="Login" style="width: 400px">

                    <h:panelGrid columns="2">

                        <p:outputLabel value="Email:" for="email" />
                        <p:inputText id="email" value="#{loginBean.usuario.email}"
                            required="true">
                            <f:passThroughAttribute name="type" value="email" />
                        </p:inputText>


                        <p:outputLabel value="Senha:" for="senha" />
                        <p:password id="senha" value="#{loginBean.usuario.senha}"
                            feedback="true" required="true" />

                        <p:commandButton value="Efetue Login"
                            action="#{loginBean.efetuaLogin}" update="@form" process="@form" />
                    </h:panelGrid>
                </p:fieldset>
                <h:panelGrid columns="1">
                    <p:message for="email" id="messageEmail" />
                    <p:message for="senha" id="messageSenha" />
                </h:panelGrid>
            </h:panelGrid>
        </h:form>
    </ui:define>

</ui:composition>

</html>
7 respostas
<?xml version="1.0" encoding="UTF-8" ?>
<!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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head />
<ui:composition template="_template.xhtml">

    <ui:define name="titulo">
        <p:outputPanel>Login</p:outputPanel>
    </ui:define>

    <ui:define name="conteudo">



        <h:form id="login">
         <p:growl id="mensagem" showDetail="true" sticky="true" />
            <h:panelGrid columns="2">
                <p:fieldset legend="Login" style="width: 400px">

                    <h:panelGrid columns="2">

                        <p:outputLabel value="Email:" for="email" />
                        <p:inputText id="email" value="#{loginBean.usuario.email}"
                            required="true" requiredMessage="Email obrigatório" validatorMessage="Email invalido">
                            <f:passThroughAttribute name="type" value="email" />
                            <f:validateRegex pattern=".+@.+"></f:validateRegex>
                        </p:inputText>


                        <p:outputLabel value="Senha:" for="senha" />
                        <p:password id="senha" value="#{loginBean.usuario.senha}"
                             required="true" requiredMessage="Senha obrigatório" />

                        <p:commandButton value="Efetue Login"
                            action="#{loginBean.efetuaLogin}" update="@form" />
                    </h:panelGrid>
                </p:fieldset>
            </h:panelGrid>
        </h:form>
    </ui:define>

</ui:composition>

</html>

Boa tarde tenta com essas alterações? e manda um feedback para ver se resolveu, coloquei algumas alterações como componentes do primefaces como o p:growl que é a mesma coisa que a mensagem, só que na minha opnião é muito mais moderna kkk. E também to validando o seu email

Boa tarde Alisson, obrigado pela resposta.

Infelizmente nao funcionou, a Exception lançada é a mesma :(

Você esta usando quantas versões do primefaces? chego a importar mais de uma versão no seu projeto web?

Só estou usando a versão 6.0 do Primefaces

Por curiosidade passa sua classe bean.

E no começo aqui você declarou

<h:head />

Essa tag já não taria dentro do seu template? será que não está ocorrendo o erro por causa que essa tag já não taria no template?

  1. Você tem razão, ja estava declarada no meu template. Removi o código mas o erro persiste.

  2. Segue as classes LoginBean e PopulaBanco:

package br.com.prova.livraria.bean;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.prova.livraria.dao.PopulaBanco;
import br.com.prova.livraria.dao.UsuarioDao;
import br.com.prova.livraria.modelo.Usuario;

@ManagedBean
@ViewScoped
public class LoginBean {

    private Usuario usuario = new Usuario();

    public Usuario getUsuario() {
        return usuario;
    }

    public void init(){

    }

    public String efetuaLogin() {

        PopulaBanco pb = new PopulaBanco();

        pb.fillLista();

        System.out.println("fazendo login do usuario " + this.usuario.getEmail());

        FacesContext context = FacesContext.getCurrentInstance();
        boolean existe = new UsuarioDao().existe(this.usuario);
        if(existe ) {
            context.getExternalContext().getSessionMap().put("usuarioLogado", this.usuario);
            return "livro?faces-redirect=true";
        }

        context.getExternalContext().getFlash().setKeepMessages(true);
        context.addMessage(null, new FacesMessage("Usuário não encontrado"));

        pb.dropLista();

        return "login?faces-redirect=true";
    }

    public String deslogar() {
        FacesContext context = FacesContext.getCurrentInstance();
        context.getExternalContext().getSessionMap().remove("usuarioLogado");
        return "login?faces-redirect=true";
    }
}
package br.com.prova.livraria.dao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;

import br.com.prova.livraria.modelo.Autor;
import br.com.prova.livraria.modelo.Livro;
import br.com.prova.livraria.modelo.Usuario;

public class PopulaBanco {




    public void fillLista() {

        LivroDao daoL = new LivroDao();
        AutorDao daoA = new AutorDao();
        UsuarioDao daoU = new UsuarioDao();

        Autor assis = geraAutor("Machado de Assis","machado@machado.com",1);
        daoA.pesist(assis);

        Autor amado = geraAutor("Jorge Amado","jorge@jorge.com",2);
        daoA.pesist(amado);

        Autor coelho = geraAutor("Paulo Coelho","paulo@paulo.com",3);
        daoA.pesist(coelho);

        Autor lobato = geraAutor("Monteiro Lobato","monteiro@monteiro.com",4);
        daoA.pesist(lobato);

        Livro casmurro = geraLivro("978-8-52-504464-8", "Dom Casmurro",
                "10/01/1899", 24.90, assis);
        Livro memorias = geraLivro("978-8-50-815415-9",
                "Memorias Postumas de Bras Cubas", "01/01/1881", 19.90, assis);
        Livro quincas = geraLivro("978-8-50-804084-1", "Quincas Borba",
                "01/01/1891", 16.90, assis);

        daoL.pesist(casmurro);
        daoL.pesist(memorias);
        daoL.pesist(quincas);

        Livro alquemista = geraLivro("978-8-57-542758-3", "O Alquimista",
                "01/01/1988", 19.90, coelho);
        Livro brida = geraLivro("978-8-50-567258-7", "Brida", "01/01/1990",
                12.90, coelho);
        Livro valkirias = geraLivro("978-8-52-812458-8", "As Valkirias",
                "01/01/1992", 29.90, coelho);
        Livro maao = geraLivro("978-8-51-892238-9", "O Diario de um Mago",
                "01/01/1987", 9.90, coelho);

        daoL.pesist(alquemista);
        daoL.pesist(brida);
        daoL.pesist(valkirias);
        daoL.pesist(maao);

        Livro capitaes = geraLivro("978-8-50-831169-1", "Capitaes da Areia",
                "01/01/1937", 6.90, amado);
        Livro flor = geraLivro("978-8-53-592569-9",
                "Dona Flor e Seus Dois Maridos", "01/01/1966", 18.90, amado);

        daoL.pesist(capitaes);
        daoL.pesist(flor);

        Usuario adm = new Usuario();
        adm.setEmail("avanade@avanade.com");
        adm.setSenha("1234");
        adm.setId(1);        
        daoU.pesist(adm);



    }

    public void dropLista(){
        LivroDao daoL = new LivroDao();
        AutorDao daoA = new AutorDao();
        UsuarioDao daoU = new UsuarioDao();

        daoL.drop();
        daoA.drop();
        daoU.drop();
    }



    private static Autor geraAutor(String nome,String email, int id) {
        Autor autor = new Autor();
        autor.setNome(nome);
        autor.setEmail(email);
        autor.setId(id);
        return autor;
    }

    private static Livro geraLivro(String isbn, String titulo, String data,
            double preco, Autor autor) {
        Livro livro = new Livro();
        livro.setIsbn(isbn);
        livro.setTitulo(titulo);
        livro.setDataLancamento(parseData(data));
        livro.setPreco(preco);
        livro.adicionaAutor(autor);
        return livro;
    }

    private static Calendar parseData(String data) {
        try {
            Date date = new SimpleDateFormat("dd/MM/yyyy").parse(data);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            return calendar;
        } catch (ParseException e) {
            throw new IllegalArgumentException(e);
        }
    }

}
solução!

Pessoal, resolvi o problema. Mudei da versão 6.0 do Primefaces para a 5.3 e agora está funcionando normalmente :D

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software