Vraptor3: Pegando resultado do método via interceptor

Fiz um interceptor, mas estou com problemas para saber o resultado do método. Na verdade o retorno do método está sendo sempre null e o método nunca é executado.

public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) throws InterceptionException { Object result = info.getResult(); System.out.println(result); }

Além disso, como faço para esse meu método evitar o redirect para minha view conforme as convenções do path-resolver?

para você ter resultado vc precisa executar o método

stack.next(…);

não entendi bem o que quis dizer na última frase, mas… vc pode alterar o redirect ou outras coisas utilizando o Result, depois de invocar o stack.next

edit:

tente assim

public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) throws InterceptionException { stack.next(method, instance); //adiciona isso que vai funcionar Object result = info.getResult(); System.out.println(result); }

Lavieri, isso mesmo, faltou o stack.next.

Estou desenvolvendo um interceptor semelhante do DownloadInterceptor, porém para capturar respostas JsonObject. Fiz baseado no DownloadInterceptor, porém nele não possui esse stack.next.

Além disso, quando meu método retorna qualquer coisa por padrão o resultado do método vai para o JSP. Porém quando você possui um retorno do método como File o resultado apenas é impresso na tela sem ser feito o forward para o JSP. No meu caso não estou conseguindo evitar que o result vá para o JSP.

Abraços

tenta isso

ps.: testei aqui e deu certo

classes usadas

import br.com.caelum.vraptor.Result; import br.com.caelum.vraptor.view.Results;

onde reulst é uma instancia de br.com.caelum.vraptor.Result

Lavieri, obrigado.

Esqueci de te comentar que eu já havia usado ele, porém no interceptor isso não funciona após o stack.next.

se você não quiser ser obrigado a colocar result.use(nothing()) no final de toda lógica,
você pode colocar o seu interceptor pra executar depois da execução do método, mas antes de redirecionar pra jsp…

pegue a classe DefaultRequestExecution, copie o fonte dela, e crie uma classe no seu projeto com o mesmo conteúdo…

anote a classe com @Component,

coloque o seu interceptor na stack, logo antes do DownloadInterceptor,

anote seu interceptor com @Component (não @Intercepts)

deve funcionar =)

(não precisa do stack.next, nesse caso)

Lucas, funcionou corretamente. Porém com esse comportamento ele não executa o método accepts(ResourceMethod). Então coloquei aquele hack igual ao do DownloadInterceptor.

Impressionante a forma como é simples sobrescrever as definições padrão do vraptor. :shock:

Compartilho com vocês então esse componente para interceptar requisições json. Copiado e colado do DownloadInterceptor, hehehehe.

[code]@Component
@RequestScoped
public class JsonInterceptor
implements Interceptor {
private final HttpServletResponse response;
private final MethodInfo info;

public JsonInterceptor(HttpServletResponse response, MethodInfo info) {
    this.response = response;
    this.info = info;
}

public boolean accepts(ResourceMethod method) {
    Class<?> type = method.getMethod().getReturnType();
    return JSONObject.class.isAssignableFrom(type);
}

public void intercept(InterceptorStack stack, ResourceMethod method, Object instance)
    throws InterceptionException {
    // TODO: remove hack
    if (!accepts(method)) {
        stack.next(method, instance);
        return;
    }

    JSONObject json = (JSONObject) info.getResult();

    try {
        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.print(json.toString());
        out.flush();
        out.close();
    } catch (IOException e) {
        throw new InterceptionException(e);
    }
}

}[/code]

Obrigado garcia!

sim… esse hack vai sair numa próxima versão… =)

[]'s