[RESOLVIDO] - Apostila Caelum FJ21 - Exercício 12.8 Interceptor

Estou com problemas nesse exercício. Parece que o tomcat não encontra o arquivo struts.xml no meu projeto. Tentei colocar o struts.xml junto com o arquivo web.xml e depois li que o local correto seria na raiz dos pacotes de classes, no diretório src mas o erro não mudou.
Senti falta da definição da localização do struts.xml que faziamos no Struts 1 dentro do arquivo web.xml, não sei se é esse o problema…

web.xml

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

struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* 15

fj21-tarefas

login.jsp

[/code]

Struts.xml

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

	<global-results>
		<result name="naoLogado">/login.jsp</result>
	</global-results>
</package>

[/code]

A classe interceptor:

[code]package tarefas.interceptor;

import tarefas.modelo.Usuario;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class LoginInterceptor implements Interceptor {

@Override
public String intercept(ActionInvocation invocation) throws Exception {
	Usuario usuarioLogado = (Usuario) invocation.getInvocationContext().
						getSession().get("usuarioLogado");
	if(usuarioLogado == null){
		return "naoLogado";
	}else{
		return invocation.invoke();
	}
}

public void destroy() {	}
public void init() {}

}
[/code]

Erro ao iniciar o tomcat:

01/07/2010 13:26:59 org.apache.catalina.core.AprLifecycleListener init INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Arquivos de programas\Java\jre6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Arquivos de programas/Java/jre6/bin/client;C:/Arquivos de programas/Java/jre6/bin;C:\Inprise\vbroker\bin;C:\Arquivos de programas\Borland\Delphi7\Bin;C:\Arquivos de programas\Borland\Delphi7\Projects\Bpl\;C:\Arquivos de programas\PC Connectivity Solution\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;.;C:\Arquivos de programas\Java\jdk1.6.0_07\bin;C:\Arquivos de programas\Microsoft SQL Server\90\Tools\binn\;C:\Arquivos de programas\TortoiseSVN\bin;C:\maven\bin;C:\Arquivos de programas\Smart Projects\IsoBuster;C:\Arquivos de programas\Notepad++;C:\MinGW\bin;C:\Arquivos de programas\MySQL\MySQL Server 5.1\bin 01/07/2010 13:27:00 org.apache.tomcat.util.digester.SetPropertiesRule begin WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:fj21-tarefas' did not find a matching property. 01/07/2010 13:27:00 org.apache.coyote.http11.Http11Protocol init INFO: Initializing Coyote HTTP/1.1 on http-8080 01/07/2010 13:27:00 org.apache.catalina.startup.Catalina load INFO: Initialization processed in 621 ms 01/07/2010 13:27:00 org.apache.catalina.core.StandardService start INFO: Starting service Catalina 01/07/2010 13:27:00 org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/6.0.26 01/07/2010 13:27:01 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info INFO: Parsing configuration file [struts-default.xml] 01/07/2010 13:27:01 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info INFO: Parsing configuration file [struts-plugin.xml] 01/07/2010 13:27:01 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info INFO: Unable to locate configuration files of the name struts.xml, skipping 01/07/2010 13:27:01 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info INFO: Parsing configuration file [struts.xml] 01/07/2010 13:27:02 com.opensymphony.xwork2.util.logging.jdk.JdkLogger error SEVERE: Dispatcher initialization failed Unable to load configuration. - [unknown location] at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:374) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:418) at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295) at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3838) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4488) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:519) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:581) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Caused by: Unable to find interceptor class referenced by ref-name login - [unknown location] at com.opensymphony.xwork2.config.providers.InterceptorBuilder.constructInterceptorReference(InterceptorBuilder.java:52) at org.apache.struts2.convention.DefaultInterceptorMapBuilder.buildInterceptorList(DefaultInterceptorMapBuilder.java:99) at org.apache.struts2.convention.DefaultInterceptorMapBuilder.build(DefaultInterceptorMapBuilder.java:90) at org.apache.struts2.convention.DefaultInterceptorMapBuilder.build(DefaultInterceptorMapBuilder.java:74) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:796) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:586) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:318) at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:204) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55) ... 22 more 01/07/2010 13:27:02 org.apache.catalina.core.StandardContext filterStart SEVERE: Exception starting filter struts2 Unable to load configuration. - [unknown location] at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:431) at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295) at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3838) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4488) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:519) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:581) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Caused by: Unable to load configuration. - [unknown location] at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:374) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:418) ... 20 more Caused by: Unable to find interceptor class referenced by ref-name login - [unknown location] at com.opensymphony.xwork2.config.providers.InterceptorBuilder.constructInterceptorReference(InterceptorBuilder.java:52) at org.apache.struts2.convention.DefaultInterceptorMapBuilder.buildInterceptorList(DefaultInterceptorMapBuilder.java:99) at org.apache.struts2.convention.DefaultInterceptorMapBuilder.build(DefaultInterceptorMapBuilder.java:90) at org.apache.struts2.convention.DefaultInterceptorMapBuilder.build(DefaultInterceptorMapBuilder.java:74) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:796) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:586) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:318) at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:204) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55) ... 22 more 01/07/2010 13:27:02 org.apache.catalina.core.StandardContext start SEVERE: Error filterStart 01/07/2010 13:27:02 org.apache.catalina.core.StandardContext start SEVERE: Context [/fj21-tarefas] startup failed due to previous errors 01/07/2010 13:27:02 org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap SEVERE: A web application created a ThreadLocal with key of type [null] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@1fe571f]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@109ea96]) but failed to remove it when the web application was stopped. To prevent a memory leak, the ThreadLocal has been forcibly removed. 01/07/2010 13:27:02 org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap SEVERE: A web application created a ThreadLocal with key of type [null] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@83b1b]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@608760]) but failed to remove it when the web application was stopped. To prevent a memory leak, the ThreadLocal has been forcibly removed.

Tenta assim:

    [code]

<package …>

        <interceptor-stack name="myStack">
        	<interceptor-ref name="login"/>
        	<interceptor-ref name="defaultStack"/>
        </interceptor-stack>
	</interceptors>
     
    <default-interceptor-ref name="myStack" />
[/code]

Acabei de descobrir que o problema estava na importação do da anotation @ParentPackage, havia importado do org.apache.struts2.config.ParentPackage, resolveu quando troquei para o org.apache.struts2.convention.annotation.ParentPackage. Isso na classe que se utilizava do Interceptor, não havia postado o código dela, mas segue abaixo pra quem tiver a mesma dúvida.

Outra coisa, se você quiser passar parametros para uma action e usar o Interceptor é essencial usar a dica do Oenning, sem o defaultStack os parametros não chegam na Action, valew a dica, ia me bater um bom tempo pra descobrir isso XD

[code]package tarefas.action;

import java.util.List;

import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Result;

import tarefas.dao.TarefaDAO;
import tarefas.modelo.Tarefa;
@ParentPackage(“default”)
public class ListaTarefasAction {
private List tarefas;

@Action(value="listaTarefas", results={
	@Result(name="ok", location="/lista-tarefas.jsp")}, 
	interceptorRefs={@InterceptorRef("login")})
public String executa(){
	tarefas = new TarefaDAO().lista();
	return "ok";
}

public List<Tarefa> getTarefas() {
	return tarefas;
}

}
[/code]

Amigo, estou com o mesmo problema, eu tenho 2 interceptor, entao o meu struts esta assim:

[code]

/jsp/usuario/loginUsuario.jsp
	<global-results>
		<result name="clienteNaoLogado">/jsp/cliente/loginCliente.jsp</result>
	</global-results>
</package>
<package name="loginClienteAndUsuario" extends="loginCliente">
	<interceptors>
		<interceptor-stack name="myStack">  
			<interceptor-ref name="loginCliente"/>
			<interceptor-ref name="loginUsuario"/>  
		</interceptor-stack>	
	</interceptors>
	<default-interceptor-ref name="myStack" />
</package>

[/code]

tentei colocar o um para cada e tentei dessa forma, colocar no ultimo porem nao consegui,

eu fiz o ultimo package pois tenho dois logins em uma mesma action, por isso na minha action eu estendo o loginClienteAndUsuario e posso utilizar qualquer um dos dois, porem nao consegui utilizar o stack, continua dando erro…

alguem me ajude por favor

Se for aquele problema que vc comentou no seu outro post dos valores virem nulos, eu resolvi algo similar com a dica do Oenning acima, acrescentando no meu interceptor-stack a linha <interceptor-ref name="defaultStack"/> . Mas se o seu problema for outro eu não vou saber ajudar pq estou aprendendo struts 2 agora =/

Entao cara o problema e o mesmo, porem nao consegui, coloquei igual ae no post, porem nada :frowning:

Deixei ate mais claro olha so como ficou:

[code]














/jsp/usuario/loginUsuario.jsp
/jsp/cliente/loginCliente.jsp

</package>
[/code]

e continua dando o mesmo erro… alguem?