FJ21 - Exercicio 9.7 - Erro de Conversão

2 respostas
fabiano.fsmj

Boa noite Galera,

Estou utilizando a apostila FJ21 da Caelum pra estudo e não consegui verificar onde estou errando no exercício 9.7 da mesma.

Segue abaixo, o código e erro apresentado. Alguém pode me ajudar com o erro?

Desde já agradeço a todos!

Interface Logica:

package br.com.caelum.agenda.mvc.logica;

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

public interface Logica {
	void executa(HttpServletRequest req, HttpServletResponse res) throws Exception;
}

Classe PrimeiraLogica

package br.com.caelum.agenda.mvc.logica;

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

public class PrimeiraLogica {
	public void executa(HttpServletRequest req, HttpServletResponse res) throws Exception {
		System.out.println("Executando a logica e redirecionando...");
		
		RequestDispatcher rd = req.getRequestDispatcher("primeira-logica.jsp");
		rd.forward(req, res);
	}
}

Classe Controller Servlet:

package br.com.caelum.agenda.mvc.servlet;

import java.io.IOException;

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

import br.com.caelum.agenda.mvc.logica.Logica;

public class ControllerServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String parametro = request.getParameter("logica");
		String nomeDaClasse = "br.com.caelum.agenda.mvc.logica." + parametro;
		
		try {
			Class classe = Class.forName(nomeDaClasse);
			
			Logica logica = (Logica) classe.newInstance();
			logica.executa(request, response);
			
		} catch (Exception e) {
			throw new ServletException("A lógica de negócio causou uma exceção", e);
		}
	}
}

Erro Console:

Ago 28, 2012 12:48:31 AM org.apache.catalina.core.AprLifecycleListener init

Informações: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/jdk1.7.0_05/jre/lib/amd64/server:/usr/java/jdk1.7.0_05/jre/lib/amd64:/usr/java/jdk1.7.0_05/jre//lib/amd64:/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server:/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64:/usr/lib/jvm/java-6-openjdk-amd64/jre//lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

Ago 28, 2012 12:48:31 AM org.apache.tomcat.util.digester.SetPropertiesRule begin

Advertência: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property source to org.eclipse.jst.jee.server:fj21-agenda did not find a matching property.

Ago 28, 2012 12:48:31 AM org.apache.coyote.AbstractProtocol init

Informações: Initializing ProtocolHandler [“http-bio-8080”]

Ago 28, 2012 12:48:31 AM org.apache.coyote.AbstractProtocol init

Informações: Initializing ProtocolHandler [“ajp-bio-8009”]

Ago 28, 2012 12:48:31 AM org.apache.catalina.startup.Catalina load

Informações: Initialization processed in 694 ms

Ago 28, 2012 12:48:31 AM org.apache.catalina.core.StandardService startInternal

Informações: Starting service Catalina

Ago 28, 2012 12:48:31 AM org.apache.catalina.core.StandardEngine startInternal

Informações: Starting Servlet Engine: Apache Tomcat/7.0.29

Ago 28, 2012 12:48:32 AM org.apache.coyote.AbstractProtocol start

Informações: Starting ProtocolHandler [“http-bio-8080”]

Ago 28, 2012 12:48:32 AM org.apache.coyote.AbstractProtocol start

Informações: Starting ProtocolHandler [“ajp-bio-8009”]

Ago 28, 2012 12:48:32 AM org.apache.catalina.startup.Catalina start

Informações: Server startup in 935 ms

Ago 28, 2012 12:49:03 AM org.apache.catalina.core.StandardWrapperValve invoke

Grave: Servlet.service() for servlet [controlador] in context with path [/fj21-agenda] threw exception [A lógica de negócio causou uma exceção] with root cause

java.lang.ClassCastException: br.com.caelum.agenda.mvc.logica.PrimeiraLogica cannot be cast to br.com.caelum.agenda.mvc.logica.Logica

at br.com.caelum.agenda.mvc.servlet.ControllerServlet.service(ControllerServlet.java:21)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)

at java.lang.Thread.run(Thread.java:722)

2 Respostas

DaniloAndrade

Bom dia Fabiano!

o seu problema é o seguinte:

nessa linha

Logica logica = (Logica) classe.newInstance();

vc ta fazendo um cast mas o objeto que vc esta tentando instanciar não “é uma Logica”.

se vc olhar no log vc ai encontrar essa linha:

java.lang.ClassCastException: br.com.caelum.agenda.mvc.logica.PrimeiraLogica cannot be cast to br.com.caelum.agenda.mvc.logica.Logica

e se vc olhar sua classe PrimeiraLogica

public class PrimeiraLogica {  
    public void executa(HttpServletRequest req, HttpServletResponse res) throws Exception {  
        System.out.println("Executando a logica e redirecionando...");  
          
        RequestDispatcher rd = req.getRequestDispatcher("primeira-logica.jsp");  
        rd.forward(req, res);  
    }  
}

ela realmente não “é uma Logica”.

Solução:
faça sua classe Primeira Logica implementar a interface Logica.

fabiano.fsmj

Boa noite Danilo,

É verdade, fiz a alteração na minha classe Primeira Lógica e funcionou perfeitamente.

Obrigado pela ajuda e compreensão.

Criado 27 de agosto de 2012
Ultima resposta 28 de ago. de 2012
Respostas 2
Participantes 2