Olá amigos estou com um problema em um projeto que estou fazendo que é baseado na loja caelum.
Estou fazendo uma aplicação (helpdesk) e quando tento acessar qualquer outra lógica, por exemplo, um cadastro simples que usaria apenas o formulario.ok dá um erro assim:
24/04/2008 11:19:26 org.apache.catalina.core.ApplicationContext log
INFO:
The server side component of the HTTP Monitor has detected a java.lang.StackOverflowError.
This happens when there is an infinite loop in the web module.
Correct the cause of the infinite loop before running the web module again.
24/04/2008 11:19:26 org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet vraptor2 threw exception
java.lang.StackOverflowError
at org.apache.catalina.core.ApplicationHttpRequest.getAttributeNames(ApplicationHttpRequest.java:243)
at org.apache.catalina.core.ApplicationHttpRequest$AttributeNamesEnumerator.<init>(ApplicationHttpRequest.java:906)
Segui o exemplo da apostila… Então colocarei abaixo minhas classes, iniciando pela classe MeusInteressesLogic que possi a primeira lógica que minha a aplicação roda (é direcionada para cá pelo index.jsp):
INDEX.JSP
<jsp:forward page="interesse.lista.logic" />
@Component("interesse")
@InterceptedBy({AutorizadorInterceptor.class,
DaoInterceptor.class})
public class MeusInteressesLogic {
@In(scope=ScopeType.SESSION)
private Usuario usuario;
private final DaoFactory daoFactory;
public MeusInteressesLogic(DaoFactory daoFactory) {
this.daoFactory = daoFactory;
}
public void lista() {
}
}
public class AutorizadorInterceptor implements Interceptor {
@In(scope=ScopeType.SESSION, required=false)
private Usuario usuario;
public void intercept(LogicFlow flow) throws LogicException, ViewException {
if (this.usuario == null) {
try {
flow.getLogicRequest().getResponse().sendRedirect("account.login.logic");
} catch (IOException e) {
throw new LogicException(e);
}
} else {
flow.execute();
}
}
}
@Component("account")
@InterceptedBy(DaoInterceptor.class)
public class LoginLogic {
private final DaoFactory daoFactory;
private Usuario usuario;
public LoginLogic(DaoFactory daoFactory) {
this.daoFactory = daoFactory;
}
public void login() {
}
public String efetuaLogin(Usuario usuario) {
UsuarioDao dao = (UsuarioDao) this.daoFactory.getUsuarioDao();
this.usuario = dao.existeUnico(usuario);
if (this.usuario != null) {
return "ok";
} else {
return "invalid";
}
}
public void logout() {
this.usuario = null;
}
@Out(scope=ScopeType.SESSION)
public Usuario getUsuario() {
return this.usuario;
}
}
public class DaoInterceptor implements Interceptor {
private final DaoFactory factory = new DaoFactory();
public void intercept(LogicFlow flow) throws LogicException, ViewException {
//Executa a lógica
flow.execute();
//Se sobrou transação sem comitar, faz rollback
if (this.factory.hasTransaction())
this.factory.rollback();
this.factory.close();
}
@Out(key="br.com.vconline.helpdesk.dao.DaoFactory")
public DaoFactory getFactory() {
return this.factory;
}
}
web/interesse/lista.ok.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page contentType="text/html" pageEncoding="iso-8859-1"%>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h2>Seja bem vindo <c:out value="${usuario.nome}" /></h2>
<a href="setor.formulario.logic">Setor</a>
</body>
</html>
web/setor/formulario.ok.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@page contentType="text/html" pageEncoding="iso-8859-1"%>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<form action="setor.salvar.logic" method="post">
<div id="form_campos">
<input type="hidden" name="setor.id" value="${setor.id}" />
<input type="hidden" name="setor.estab" value="${usuario.estab}" />
Descrição:<input type="text" name="setor.descricao" value="${setor.descricao}" />
</div>
<div id="form_botao">
<input type="submit" />
</div>
</form>
</body>
</html>
Aonde que está o erro disso ??? Eu tentei debbugar pra ver se encontrava algum problema, e percebi que o programa fica “preso” entre o DaoInterceptor e o AutorizadorInterceptor. Ele valida o usuário no AutorizadorInterceptor (if (this.usuario == null) {), caí no else que tem um flow.execute(), este manda denovo para o DaoFactory, no método intercept que tem um outro flow.execute() que manda novamente para o AutorizadorInterceptor. E desta forma ele fica em loop.
Como é que posso resolver este problema ??
Abraços