4
respostas

O projeto não roda no Java 1.8

O projeto do professor não roda em um ambiente com o Java 1.8, nem a pau. A classe que ele alterou que foi a UnicaEntradaServlet, com o trecho

String paramAcao = request.getParameter("acao");

        String nomeDaClasse = "br.com.alura.gerenciador.acao." + paramAcao;

        String nome;
        try {
            Class classe = Class.forName(nomeDaClasse);//carrega a classe com o nome 
            Acao acao = (Acao) classe.newInstance();
            nome = acao.executa(request,response);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            throw new ServletException(e);
        }

        String[] tipoEEndereco = nome.split(":");
        if(tipoEEndereco[0].equals("forward")) {
            RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/view/" + tipoEEndereco[1]);
            rd.forward(request, response);
        } else {
            response.sendRedirect(tipoEEndereco[1]);
        }

Tem o seguinte erro

INFORMAÇÕES: Server startup in [861] milliseconds
mar 28, 2020 1:38:19 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [br.com.alura.gerenciador.servlet.UnicaEntradaServlet] in context with path [/gerenciador] threw exception [java.lang.ClassNotFoundException: br.com.alura.gerenciador.acao.listaempresas] with root cause
java.lang.ClassNotFoundException: br.com.alura.gerenciador.acao.listaempresas
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at br.com.alura.gerenciador.servlet.UnicaEntradaServlet.service(UnicaEntradaServlet.java:27)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
4 respostas

Como uso o java 1.8, o metodo newInstance() não é descontinuado ainda.

No seu projeto, você tem um classe chamada class listaempresas ou class ListaEmpresas?

Não estou por dentro do curso ou do projeto web específico, mas eu diria que o parâmetro passado não está passando o nome da classe igualzinho ao nome da classe, respeitando maiúsculas e minúsculas.

Oi José,

Não tenho nenhuma classe com o nome listaempresas, mas sim os return "forward:listaempresas.jsp";.

package br.com.caelum.gerenciador.servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.gerenciador.acao.AlteraEmpresa;
import br.com.caelum.gerenciador.acao.ListaEmpresas;
import br.com.caelum.gerenciador.acao.Login;
import br.com.caelum.gerenciador.acao.LoginForm;
import br.com.caelum.gerenciador.acao.Logout;
import br.com.caelum.gerenciador.acao.MostraEmpresa;
import br.com.caelum.gerenciador.acao.NovaEmpresa;
import br.com.caelum.gerenciador.acao.NovaEmpresaForm;
import br.com.caelum.gerenciador.acao.RemoveEmpresa;

/**
 * Servlet Filter implementation class AutorizacaoFilter
 */
//@WebFilter("/entrada")
public class ControladorFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void destroy() {};

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest serveletRequest, ServletResponse serveletResponse, FilterChain chain) throws IOException, ServletException {        

        System.out.println("ControladorFilter");

        HttpServletRequest request = (HttpServletRequest) serveletRequest;
        HttpServletResponse response = (HttpServletResponse) serveletResponse;

        String paramAcao = request.getParameter("acao");

        String nome = null;

        if (paramAcao.equals("listaempresas")) {
            ListaEmpresas acao = new ListaEmpresas();
            nome = acao.executa(request, response);

        } else if (paramAcao.equals("removeempresa")) {
            RemoveEmpresa acao = new RemoveEmpresa();
            nome = acao.executa(request, response);

        } else if (paramAcao.equals("mostraempresa")) {
            MostraEmpresa acao = new MostraEmpresa();
            nome = acao.executa(request, response);

        } else if (paramAcao.equals("alteraempresa")) {
            AlteraEmpresa acao = new AlteraEmpresa();
            nome = acao.executa(request, response);

        } else if (paramAcao.equals("novaempresa")) { // Nova Empresa
            NovaEmpresa acao = new NovaEmpresa();
            nome = acao.executa(request, response);

        } else if (paramAcao.equals("novaempresaform")) { // Nova Empresa Form
            NovaEmpresaForm acao = new NovaEmpresaForm();
            nome = acao.executa(request, response);

        } else if (paramAcao.equals("login")) { // Login
            Login acao = new Login();
            nome = acao.executa(request, response);

        } else if (paramAcao.equals("loginform")) { // Login Form
            LoginForm acao = new LoginForm();
            nome = acao.executa(request, response);

        } else if (paramAcao.equals("logout")) { // Logout
            Logout acao = new Logout();
            nome = acao.executa(request, response);

        }

        String[] tipoEndereco = nome.split(":");
        if (tipoEndereco[0].equals("forward")) {
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("WEB-INF/view/" + tipoEndereco[1]);
            requestDispatcher.forward(request, response);
        } else {
            response.sendRedirect(tipoEndereco[1]);
        }
    }


}
package br.com.caelum.gerenciador.acao;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.gerenciador.modelo.Banco;
import br.com.caelum.gerenciador.modelo.Empresa;

public class ListaEmpresas implements Acao {

    public String executa(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        System.out.println("Empresas");

        Banco banco = new Banco();
        List<Empresa> lista = banco.getEmpresas();

        request.setAttribute("empresas", lista);

        return "forward:listaempresas.jsp";

    }

}

Hum, jsp n é a minha praia. Veja que a class ListaEmpresas está na package 'br.com.caelum.gerenciador.acao' enquanto q o seu código inicial espera que a class a fazer loading esteja na package "br.com.alura.gerenciador.acao.". Será que trocando caelum por alura não vai?