É possível acessar uma lógica através de um interceptador ?
Eu preciso implementar um Interceptor que obtenha de forma GENÉRICA o objeto da lógica e acessa-la através deste interceptador, ou seja: lógicas genéricas no VRaptor 2.6.0
Acredito que inicialmente eu devo criar uma interface que implemente dois métodos (resultList e resultSize) e que este seja implementado em todas as minhas classes de lógicas, sendo que estes métodos serão chamados de forma genérica de dentro do Interceptor.
Porém não tenho ideia de como expressar genericamente uma classe de lógica (componente), sendo assim, alguém já fez este tipo de acesso ?
Minha intenção é implementar um código parecido com isso.
Obrigado.
bom, vc pode colocar o @InterceptedBy só nas lógicas necessárias, e vc pode pegar a instância assim:
flow.getLogicRequest().getLogicDefinition().getComponent();
ou alguma variação disso
Lucas, obrigado por responder!
No blob da caelum é mencionado sobre a apostila FJ-28 (atualizada) contendo Lógicas Genéricas, mas inicialmente não encontrei algo parecido.
Eu já utilizo @InterceptedBy e já sabia do getComponent(), porém ele retorna um Objeto e não sei como fazer um CAST para assim acessar os dois métodos que estarão disponíveis em cada Class Logic através de Interface.
Então na minha interface eu teria os dois métodos:
public interface MyInterface {
public List getResultList(int page, int pageSize) {}
public int getResultSize() {}
}
- Cada class logic teria sua implementação individual para os métodos da interface.
Já dentro do Interceptador eu teria algo parecido com isso:
Object obj = flow.getLogicRequest().getLogicDefinition().getComponent();
request.setAttribute(“collection”, ((MyInterface) obj).getResultList(1, ((MyInterface) obj).getResultSize()));
request.setAttribute(“resultSize”, new Integer(((MyInterface) obj).getResultSize())));
Alguma ideia ou dica ?
a apostila mencionada é a do VRaptor3, o VRaptor 2 foi descontinuado…
o que vc precisa fazer é algo parecido com o que vc mandou aí mesmo…
vc pode fazer o cast diretamente:
MyInterface obj = (MyInterface) flow.getLogicRequest().getLogicDefinition().getComponent()
daí vc não precisa ficar fazendo cast depois toda hora.
PS: não faça coisas novas em VRaptor2, se possível migre pro vraptor 3 (da pra fazer aos poucos)
http://vraptor.caelum.com.br/documentacao/migrando-do-vraptor2-para-o-vraptor3/
PS2: coloque os códigos aqui no guj entre [code] e [/ code] (sem espaços)
Lucas, novamente muito obrigado pelas dicas!
Vou fazer uma implementação aqui e ver “o final da história”…
Bom dia!
Eu fiz as seguintes implementações:
Minha Interface
package br.com.faespsenar.sicp.logic.util;
import java.util.List;
public interface DisplayTagPaging<T> {
public List<T> getTestData(int page, int pageSize);
public Integer getTestDataSize();
}
Meu Interceptador:
package br.com.faespsenar.sicp.interceptor;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.vraptor.Interceptor;
import org.vraptor.LogicException;
import org.vraptor.LogicFlow;
import org.vraptor.annotations.In;
import org.vraptor.view.ViewException;
import br.com.faespsenar.sicp.logic.util.DisplayTagPaging;
@SuppressWarnings({ "rawtypes", "unused" })
public class DisplayTagInterceptor implements Interceptor {
@In
private HttpServletResponse response;
@In
private HttpServletRequest request;
public void intercept(LogicFlow flow) throws LogicException, ViewException {
//get the page number from request
int page = getPage(request);
int size = 25;
DisplayTagPaging logic = (DisplayTagPaging) flow.getLogicRequest().getLogicDefinition().getComponent();
//pass in page and size
//request.setAttribute("collection", logic.getTestData(page, size));
request.setAttribute("trabalhadores", logic.getTestData(page, size));
//get the total size of collection , required for display tag to get the pagination to work
request.setAttribute("resultSize", new Integer(logic.getTestDataSize()));
if (flow != null) flow.execute();
}
public int getPage(HttpServletRequest request){
int page=0;
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String name = (String)paramNames.nextElement();
if (name != null && name.startsWith("d-") && name.endsWith("-p")) {
String pageValue = request.getParameter(name);
if (pageValue != null)
page = Integer.parseInt(pageValue)-1;
}
}
return page;
}
}
Minha lógica com o Interceptador:
@InterceptedBy({ DisplayTagInterceptor.class })
public class TrabalhadorLogic implements DisplayTagPaging {
...
...
...
}
Porém flow.getLogicRequest().getLogicDefinition().getComponent(); esta retornando null, qual será o motivo ?
tenta colocar essa linha depois do flow.execute()