Capturar exceptions, algumas dúvidas

131 views
Skip to first unread message

Carlos A. Junior

unread,
Jul 8, 2011, 9:29:10 AM7/8/11
to caelum-vraptor
Bom dia senhores,

Tenho algumas dúvidas quanto a capturar exceções aqui na aplicação.
Nos DAOs e nos componentes especializados (geo-processamento) que
escrevi aqui, em todos eles eu delego a responsabilidade de tratar as
exceções para quem está chamando, só que tem alguns casos que gostaria
de fazer alguns tratamentos, isso mais voltado ao usuário final.

Existe alguma forma de eu mapear ou capturar algumas exceptions
direto no Interceptor por exemplo... mais ou menos assim...

if(ResourceMethod.hasException())
{
....alguma solução amigável ao usuário da aplicação...
}
No web.xml eu sei que tem como fazer uma error-page, só que não tem
uma solução para isto no vraptor ou spring ?

Desde já agradeço. Um bom dia.

Lucas Cavalcanti

unread,
Jul 8, 2011, 9:43:40 AM7/8/11
to caelum-...@googlegroups.com
num interceptor vc pode fazer:

[code]
try {
    stack.next(...);
} catch (SuaException ex) {
     //seu tratamento
}
[/code]


2011/7/8 Carlos A. Junior <carlosj...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To post to this group, send email to caelum-...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vrapto...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor?hl=en.


Narciso Benigno

unread,
Jul 8, 2011, 9:47:44 AM7/8/11
to caelum-...@googlegroups.com

O carlos, como está?

Se forem exceções de negócio acho que vocêdeveria usar os validators do vraptor. Ou usar os exceptions handling do vraptor.

Caso caso seja exceção geral mesmo o negócio é usar as error-pages mesmo

Abraço

Carlos A. Junior

unread,
Jul 8, 2011, 10:29:14 AM7/8/11
to caelum-vraptor
Lucas e Narciso,

Funcionou perfeitamente.

Tenho mais um dúvida, eu fiz um componente @SessionScoped para
gerenciar mensagens a serem apresentadas ao usuário. Quando eu utilizo
o forwardTo da classe Result ele imprime no JSP perfeitamente essa
mensagem, só que quando utilizo o redirectTo ele não imprime, na
verdade deveria fazer isso:

1) armazena mensagem qualquer;
2) redireciona para uma lógica;
3) no index.jsp incluído pelo arquivo da lógica imprime o List de
mensagens que é incluído pela Superclasse dos controladores que eu
fiz;

Quando uso o redirectTo está invertendo o item 2 pelo 3, e não
consegui descobrir o porque. Um lógica qualquer:

@Resource
public class EscolaridadeController extends ApplicationController
...

@Get({"/escolaridades/add/", "/escolaridades/edit/{escolaridade.id}"})
public void formulario(Escolaridade escolaridade)
...
if(nao_atendeu_algum_item_redireciona_para_o_home_controller)
{
this.getApplicationResource().storeSystemMessage("titulo",
"descrição", tipo_da_mensagem);

this.getApplicationResource().getResult().redirectTo(HomeController.class).index();
}

Lembro que se troco por forwardTo funciona normalmente.

Ainda tem o lance de uma exception estranha que acontece em alguns
controladores:

2011-07-08 11:16:50.237:WARN::/sisui/escolaridades/
java.lang.IllegalStateException: Committed
at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1046)
at
javax.servlet.ServletResponseWrapper.resetBuffer(ServletResponseWrapper.java:
202)
at org.eclipse.jetty.servlets.GzipFilter
$GZIPResponseWrapper.resetBuffer(GzipFilter.java:324)
at org.eclipse.jetty.servlets.GzipFilter
$GZIPResponseWrapper.sendRedirect(GzipFilter.java:345)
at
javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:
136)
at
br.com.caelum.vraptor.http.VRaptorResponse.sendRedirect(VRaptorResponse.java:
46)
at br.com.caelum.vraptor.view.DefaultLogicResult
$2.intercept(DefaultLogicResult.java:124)
at br.com.caelum.vraptor.proxy.AbstractCglibProxifier
$2.intercept(AbstractCglibProxifier.java:56)
at org.hidroinformatica.sisui.controllers.LoginController$
$EnhancerByCGLIB$$67dd2ea5.formulario(<generated>)
at
vraptor.interceptors.UserSessionInterceptor.intercept(UserSessionInterceptor.java:
107)
at
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:
54)
at
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:
54)
at
br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:
71)
at
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:
54)
at
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:
54)
at
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:
61)
at
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:
54)
at
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:
83)
at
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:
54)
at
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:
54)
at
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:
48)
at
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:
54)
at
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:
54)
at
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:
69)
at
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:
54)
at
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:
54)
at
br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:
23)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
at
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:
58)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
at org.eclipse.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1323)
at
org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:
77)
at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:
133)
at org.eclipse.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1323)
at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:
476)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:
119)
at
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:
480)
at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:
225)
at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:
937)
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:
406)
at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:
183)
at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:
871)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:
117)
at
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:
247)
at
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:
149)
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:
110)
at org.eclipse.jetty.server.Server.handle(Server.java:346)
at
org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:
589)
at org.eclipse.jetty.server.HttpConnection
$RequestHandler.headerComplete(HttpConnection.java:1048)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:601)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:
214)
at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:
411)
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:
531)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint
$1.run(SelectChannelEndPoint.java:40)
at org.eclipse.jetty.util.thread.QueuedThreadPool
$3.run(QueuedThreadPool.java:529)
at java.lang.Thread.run(Thread.java:679)

Alguém tem um idéia do que pode ser ? Jogo pro alto e faço um
refactoring da estrutura da aplicação aqui? Queria trocar o fowardTo
pelo redirect devido ao redirecionamento independente do navegador do
usuário.


Lucas Cavalcanti

unread,
Jul 8, 2011, 10:53:10 AM7/8/11
to caelum-...@googlegroups.com
this.getApplicationResource().getResult()

algum motivo especial pra fazer isso ao invés de receber um result direto no construtor do controller?

pelo que eu entendi esse aplicationResource é SessionScoped, certo? se sim, o result que vc está usando
e da requisição anterior, por isso é que dá o erro.

[]'s
2011/7/8 Carlos A. Junior <carlosj...@gmail.com>
Lucas e Narciso,


--

Washington Botelho

unread,
Jul 8, 2011, 1:32:43 PM7/8/11
to caelum-...@googlegroups.com
Oi Carlos,

Você pode injetar o Result diretamente na classe pai do seu controller e usá-lo diretamente.

result.include("--", "--").fowardTo();

Ou se quiser, cria um método que sempre inclui um mensagem em uma certa variável "error", como já fiz em um projeto a um bom tempo atrás:

this.addError("error message");
result.fowardTo("...");

Este método irá usar o result que foi injetado na classe pai, porém o mesmo result é utilizado no controller filho.
Logo verifique o que o Lucas falou dos diferentes results.
Não vejo necessidade de inxar a sessão com mensagens que deverão ser apresentadas apenas uma vez a cada erro.


--
Washington Botelho

http://wbotelhos.com.br
http://twitter.com/wbotelhos


2011/7/8 Carlos A. Junior <carlosj...@gmail.com>
Lucas e Narciso,


--

Carlos A. Junior

unread,
Jul 8, 2011, 3:32:53 PM7/8/11
to caelum-vraptor
Boa tarde senhores,

Então, o Lucas matou a charada aqui, a classe lá estava como
SessionScoped.

Washington, eu estava deixando um objeto encapsulado com as mensagens
e deixando eles apenas uma vez em memória/sessão, tentei copiar o
esquema que o Joomla! usa com o JMessage que roda no core.

Acho que por uma sexta-feira já está bom :).

Um forte abraço a todos e um bom fim de semana.




On 8 jul, 14:32, Washington Botelho <wbotel...@gmail.com> wrote:
> Oi Carlos,
>
> Você pode injetar o Result diretamente na classe pai do seu controller e
> usá-lo diretamente.
>
> result.include("--", "--").fowardTo();
>
> Ou se quiser, cria um método que sempre inclui um mensagem em uma certa
> variável "error", como já fiz em um projeto a um bom tempo atrás:
>
> this.addError("error message");
> result.fowardTo("...");
>
> Este método irá usar o result que foi injetado na classe pai, porém o mesmo
> result é utilizado no controller filho.
> Logo verifique o que o Lucas falou dos diferentes results.
> Não vejo necessidade de inxar a sessão com mensagens que deverão ser
> apresentadas apenas uma vez a cada erro.
>
> --
> Washington Botelhohttp://wbotelhos.com.brhttp://twitter.com/wbotelhos
>
> 2011/7/8 Carlos A. Junior <carlosjrcabe...@gmail.com>
Reply all
Reply to author
Forward
0 new messages