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

Problema com Class<?> tipo = Class.forName(tarefa);

Estou tendo um erro 500 quando o servlet FazTudo, quando o programa eecuta a linha Class<?> tipo = Class.forName(tarefa); ele me retornajavax.servlet.ServletException.

Servlet FazTudo:

package br.com.alura.gerenciador.web;

import java.io.IOException;
import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author T-800
 */
@WebServlet(name = "FazTudo", urlPatterns = {"/FazTudo"})
public class FazTudo extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String tarefa = req.getParameter("tarefa");

        if(tarefa==null) {
            throw new IllegalArgumentException("Não há tarefa a ser processada");
        }
        try {
            System.out.println("inicio try");
            tarefa = "br.com.alura.gerent.web." + tarefa;
            System.out.println(tarefa);
            System.out.println("pegando tipo da tarefa");
            Class<?> tipo = Class.forName(tarefa);
            System.out.println("instanciando tarefa");
            Tarefa instancia = (Tarefa) tipo.newInstance();
            System.out.println("pegando uri e salvando em string");
            String pagina = instancia.executa(req, resp);
            System.out.println("fazendo request dispatcher");
            RequestDispatcher dispatcher = req.getRequestDispatcher(pagina);
            System.out.println("dispatcher foward");
            dispatcher.forward(req, resp);

        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | ServletException | IOException classNotFoundException) {
            throw new ServletException();
        }

    }



}

classe BuscaEmpresa:

package br.com.alura.gerenciador.web;

import java.util.Collection;

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

import br.com.alura.gerenciador.model.Empresa;
import br.com.alura.gerenciador.dao.EmpresaDAO;


public class BuscaEmpresa implements Tarefa{

    public BuscaEmpresa(){
        System.out.println("Construindo uma servlet do tipo Busca Empresa");
    }

    @Override
    public String executa(HttpServletRequest req, HttpServletResponse resp) {
           String filtro = req.getParameter("filtro");   
    Collection<Empresa> empresas = new EmpresaDAO().buscaPorSimilaridade(filtro);
        req.setAttribute("empresas",empresas);
        return "/WEB-INF/pagina/buscaEmpresa.jsp";
    }
}

interface Tarefa:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.alura.gerenciador.web;

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

/**
 *
 * @author T-800
 */
public interface Tarefa {

    String executa(HttpServletRequest req, HttpServletResponse resp);

}

erro no navegador:

HTTP Status 500 - Internal Server Error

type Exception report

messageInternal Server Error

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

exception

javax.servlet.ServletException

note The full stack traces of the exception and its root causes are available in the Payara Server 4.1.2.174 #badassfish logs.
Payara Server 4.1.2.174 #badassfish
7 respostas

log do servidor:


INFORMAÇÕES:   Loading application [gerent] at [/gerent]
INFORMAÇÕES:   gerent was successfully deployed in 1.858 milliseconds.
INFORMAÇÕES:   Usuario<deslogado> acessando o URI/gerent/
INFORMAÇÕES:   Usuario<deslogado> acessando o URI/gerent/FazTudo
INFORMAÇÕES:   inicio try
INFORMAÇÕES:   BuscaEmpresa
INFORMAÇÕES:   pegando tipo da tarefa
ADVERTÊNCIA:   StandardWrapperValve[FazTudo]: Servlet.service() for servlet FazTudo threw exception
javax.servlet.ServletException
    at br.com.alura.gerenciador.web.FazTudo.service(FazTudo.java:47)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1692)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:339)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:209)
    at br.com.alura.gerenciador.web.FiltroDeAuditoria.doFilter(FiltroDeAuditoria.java:41)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:251)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:209)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:654)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:593)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:483)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
    at java.lang.Thread.run(Thread.java:748)

Oi Fernando.

De acordo com seu erro, parece que a classe não foi encontrada. Ok, e aí? Isso quer dizer que houve algum erro no nome da classe incluindo o pacote.

Reparei também que no seu Log, ao imprimir a variável tarefa, sua aplicação imprimiu somente o nome da classe, sem o pacote:

INFORMAÇÕES:   inicio try
INFORMAÇÕES:   BuscaEmpresa
INFORMAÇÕES:   pegando tipo da tarefa

Mas no seu código você reatribui o valor da variável incluindo o pacote:

System.out.println("inicio try");
tarefa = "br.com.alura.gerent.web." + tarefa;
System.out.println(tarefa);
System.out.println("pegando tipo da tarefa");

Então vou ter que concluir que seu código não estava atualizado na hora de execução, pois deveria ter impresso o valor correto da variável tarefa: br.com.alura.gerent.web.BuscaEmpresa

Consegue conferir se recompilando o projeto as coisas mudam?

Realmente estava desatualizado o que enviei, recompilei mas o erro persiste. log do servidor:

INFORMAÇÕES:   inicio try
INFORMAÇÕES:   br.com.alura.gerent.web.BuscaEmpresa
INFORMAÇÕES:   pegando tipo da tarefa
ADVERTÊNCIA:   StandardWrapperValve[FazTudo]: Servlet.service() for servlet FazTudo threw exception
javax.servlet.ServletException

Oi Fernando, faltou você pegar o construtor correto da classe. Sei que só tem um, mas é obrigatório:

Tarefa instancia = (Tarefa) tipo.getConstructor().newInstance();

Se tivesse algum construtor que recebesse parâmetro, seria assim:

// exemplo de construtor com long e string
public BuscaEmpresa (Long idEmpresa, String nomeDaEmpresa) {}
// chamada do construtor com parametros
Tarefa instancia = (Tarefa) tipo.getConstructor(Long.class, String.class).newInstance(1l, "nome da empresa");

não sei exatamente aonde foi o erro, eu reescrevi apenas as linhas onde a classe é definida( class.forname) e funcionou. não precisei colocar este:

Tarefa instancia = (Tarefa) tipo.getConstructor().newInstance();

mas caso fosse necessário coloca-lo onde eu teria de encaixa-lo? colocaria no lugar do

 Tarefa instancia = (Tarefa) tipo.newInstance();

?

solução!

o try ficou desta maneira:

 System.out.println("inicio try");
            tarefa = "br.com.alura.gerenciador.web." + tarefa;
            System.out.println(tarefa);
            System.out.println("pegando tipo da tarefa");
            Class<?> tipo = Class.forName(tarefa);
            System.out.println("instanciando tarefa");
            Tarefa instancia = (Tarefa) tipo.newInstance();
            System.out.println("pegando uri e salvando em string");
            String pagina = instancia.executa(req, resp);
            System.out.println("fazendo request dispatcher");
            RequestDispatcher dispatcher = req.getRequestDispatcher(pagina);
            System.out.println("dispatcher foward");
            dispatcher.forward(req, resp);

nao encontrei a diferença de um para o outro

Ótimo, então eu também aprendi algo: não é obrigatório pegar o construtor.

Não consigo imaginar qual foi o problema exceto algum caractere bizarro, já que reescrever funcionou.