Possível Bug no Vraptor

54 respostas
G

Olá pessoal,

Recentemente eu postei um tópico querendo saber como eu configurava uma url para erro 404. O problema é que o Vraptor só permite tratar erros 404 com páginas estáticas. Quando a gente coloca uma url que vai ser tratada por um controller, não funciona. O tópico em questão era esse aqui: http://www.guj.com.br/java/304932-pagina-de-erro-personalizada-no-vraptor#1621778

Eu dei uma olhada no código do Vraptor e encontrei o problema. Acredito ser um bug. Quando a gente acessa uma url que não existe, o filtro do Vraptor é acionado 2 vezes: a primeira acontece por conta do dispatcher REQUEST e a segunda por conta do dispatcher ERROR. Nessa segunda vez, a requisição que chega no filtro está procurando pela URL configurada no web.xml.

O problema é que, quando o fluxo de execução chega na classe DefaultResourceTranslator, a requisição está procurando pela URL que não existe. Em algum momento ocorre essa mudança e acredito que isso seja um erro.

Para reproduzir o erro, coloque a seguinte configuração no web.xml:

<error-page> <error-code>404</error-code> <location>/404</location> </error-page>
Além disso, adicione o dispatcher de ERROR no filter-mapping.

Depois coloque um breakpoint na linha 93 da classe VRaptor e na linha 48 da classe DefaultResourceTranslator. Inicie o servidor e tente acessar uma URL inválida. Quando passar a primeira vez pelos breakpoints, pode pular, pois são referentes ao dispatcher REQUEST. Na segunda vez que passar pelos breakpoints, inspecione a instância de RequestInfo e perceba que a requisição mudou de um momento pro outro.

Só pra testar, eu coloquei o seguinte trecho de código na classe DefaultResourceTranslator:

if(info.getRequest().getDispatcherType().equals(DispatcherType.ERROR)) { resourceName = "/404"; }
E funcionou… O problema é que eu não consegui resolver o problema na raiz… Não era pra chegar uma outra requisição aí. Seria um bug de fato? Se sim, como posso resolvê-lo?

54 Respostas

Lucas_Cavalcanti

tentou com o VRaptor 3.5.3?

eu mexi num código que pode afetar isso…

G

Lucas Cavalcanti:
tentou com o VRaptor 3.5.3?

eu mexi num código que pode afetar isso…

Tentei com o Vraptor 3.5.4-SNAPSHOT. Como eu faço pra baixar o código do VRaptor 3.5.3?

Lucas_Cavalcanti

pelo maven:

http://repo1.maven.org/maven2/br/com/caelum/vraptor/3.5.3/

tem o jar dos sources lá

G

Lucas Cavalcanti:
pelo maven:

http://repo1.maven.org/maven2/br/com/caelum/vraptor/3.5.3/

tem o jar dos sources lá

Oi Lucas, eu baixei aqui o Vrapter 3.5.3 e continua com o mesmo problema. Em algum momento no meio da aplicação a instância de RequestInfo muda. Eu testei acessar URLs válidas para ver se esse era um comportamento padrão do framework e eu percebi que não. Todas as URLs que eu acessei e a página carregou com sucesso, a instância de RequestInfo era a mesma nos 2 lugares que eu falei. Eu acredito que esse é justamente o problema de não ser possível configurar uma URL de erro 404 que passa por um controller.

PS: quando eu baixei o source do maven, eu tive que montar a estrutura de diretórios do projeto “na mão”… era pra ser assim mesmo? ou tinha alguma forma automática?

Lucas_Cavalcanti

o source que está no maven não é pra vc importar como um projeto… é pra vc dar um ‘Attach Sources’ no jar.

Lucas_Cavalcanti

O problema talvez esteja nesse trecho:

vc consegue debugar e ver se ele entra no if?

G

E quando eu faço isso ele sobrescreve o código do projeto atual?

Lucas_Cavalcanti

não, é só pra fins de debug.

G

Lucas Cavalcanti:
O problema talvez esteja nesse trecho:

vc consegue debugar e ver se ele entra no if?

Ele não entra no if. Nem quando eu acesso uma URL válida, nem quando eu acesso uma URL inválida.

G

Não entendi muito bem… Se eu der um attach source do vraptor 3.5.3 no projeto do vraptor 3.5.4-SNAPSHOT e mandar debuggar ele vai usar o código do 3.5.3? E se eu não mandar debuggar, vai usar o código do 3.5.4-SNAPSHOT?

Lucas_Cavalcanti

então veja se o request.getRequestURI() muda do /sbrubbles pro /404

Lucas_Cavalcanti

vc tem que colocar só o jar do vraptor-3.5.3 no projeto e dar um attach sources nesse jar.

mas se vc tem o projeto do 3.5.4-SNAPSHOT já configurado, mantenha isso…

G

Não muda… O problema é justamente esse: nas 2 vezes que fluxo de execução passa por ali request.getRequestURI() retorna /vraptor-blank-project/sbrubbles…

Mas o que eu to achando estranho é que a requisição que chega no filtro do Vraptor está buscando por /404 (que é o correto)… Mas no meio do código essa requisição muda pra /sbrubbles de novo… E é isso que não devia acontecer…

Lucas_Cavalcanti

dá uma olhada nos atributos do request pra ver se tem algum que guarda a requisição pra /404.

tem que passar por request.getAttributeNames() e ver se tem algum que é isso.

G

Lucas Cavalcanti:
dá uma olhada nos atributos do request pra ver se tem algum que guarda a requisição pra /404.

tem que passar por request.getAttributeNames() e ver se tem algum que é isso.

Passando por request.getAttributeNames() não tem nenhum que guarda a requisição pra /404. Os que tem são os seguintes:

[list]javax.servlet.error.message[/list]
[list]methodInfo[/list]
[list]javax.servlet.error.status_code[/list]
[list]javax.servlet.error.servlet_name[/list]
[list]resourceLookupInterceptor[/list]
[list]javax.servlet.error.request_uri[/list]

Até existe um campo que guarda a requisição pra /404:

Mas eu já tentei “pegar” esse atributo de várias formas e não consegui…

Lucas_Cavalcanti

e esse cara? javax.servlet.error.request_uri

o que tem dentro dele?

o que é o campo request.requestDispatcherPath? é um atributo?

G

Lucas Cavalcanti:
e esse cara? javax.servlet.error.request_uri

o que tem dentro dele?

Retorna “/vraptor-blank-project/sbrubbles”

É um atributo que eu consigo ver inspecionando a variável, mas que não é retornado em request.getAttributeNames(). Já procurei bastante pela net e não consegui pegar o valor desse atributo… Acho que a única maneira seria usando reflection. Mas isso seria uma forma ruim de resolver o problema. Ainda acho que a raiz do problema é que a request muda no meio da execução. Isso não faz sentido. Se você tiver Skype posso compartilhar minha tela e explicar melhor o que eu to falando…

Lucas_Cavalcanti

Faz mais um teste…

Abra a classe VRaptor,
coloque um breakpoint no começo do doFilter,

inspecione o request tanto na primeira requisição quanto no 404… e veja se nesse segundo request existe alguma maneira de pegar a URI /404.

G

Lucas Cavalcanti:
Faz mais um teste…

Abra a classe VRaptor,
coloque um breakpoint no começo do doFilter,

inspecione o request tanto na primeira requisição quanto no 404… e veja se nesse segundo request existe alguma maneira de pegar a URI /404.

Dá sim… Isso ilustra o que eu to falando… A requisição muda no meio da execução… Assim que entra no filtro eu tenho uma requisição, lá pro meio da execução eu tenho outra… Oo

Lucas_Cavalcanti

mas vc conseguiu pegar o /404 dentro do filtro do VRaptor?

G

Consegui…

Lucas_Cavalcanti

ok… o problema é que o RequestInfo é setado na thread atual para uso interno do VRaptor.

quando acontece um 404, ele redireciona para a error-page, mas dentro da mesma request, ou seja, mesma thread.

Por causa disso, o RequestInfo é o da primeira requisição, não o do redirecionamento para o erro…

não tem um jeito muito fácil de resolver esse problema, mas a idéia seria tentar melhorar o escopo de request pra saber tratar esse caso.

Vc tá usando o Guice, certo?
tenta usar o Spring, só pra testar isso, se for fácil.

G

Lucas Cavalcanti:
ok… o problema é que o RequestInfo é setado na thread atual para uso interno do VRaptor.

quando acontece um 404, ele redireciona para a error-page, mas dentro da mesma request, ou seja, mesma thread.

Por causa disso, o RequestInfo é o da primeira requisição, não o do redirecionamento para o erro…

não tem um jeito muito fácil de resolver esse problema, mas a idéia seria tentar melhorar o escopo de request pra saber tratar esse caso.

Vc tá usando o Guice, certo?
tenta usar o Spring, só pra testar isso, se for fácil.

Não sei qual eu estou usando. Como faz pra saber? E como faz pra mudar?

Lucas_Cavalcanti

só olhar no WEB-INF/lib… se só tiver o jar do guice, vc está usando ele :stuck_out_tongue:

pra usar o spring, se vc estiver usando o maven é  adicionar essas dependencias:

<aside class="onebox githubblob">
  <header class="source">
      <a href="https://github.com/caelum/vraptor/blob/master/vraptor-core/pom.xml#L73-L122" target="_blank">github.com</a>
  </header>
  <article class="onebox-body">
    <h4><a href="https://github.com/caelum/vraptor/blob/master/vraptor-core/pom.xml#L73-L122" target="_blank">caelum/vraptor/blob/master/vraptor-core/pom.xml#L73-L122</a></h4>
<pre class="onebox"><code class="lang-xml"><ol class="start lines" start="73" style="counter-reset: li-counter 72 ;">
<li>		<!-- spring --></li>
<li>		<dependency></li>
<li>			<groupId>org.springframework</groupId></li>
<li>			<artifactId>spring-aop</artifactId></li>
<li>			<version>3.0.5.RELEASE</version></li>
<li>			<optional>true</optional></li>
<li>		</dependency></li>
<li>		<dependency></li>
<li>			<groupId>org.springframework</groupId></li>
<li>			<artifactId>spring-asm</artifactId></li>
<li>			<version>3.0.5.RELEASE</version></li>
<li>			<optional>true</optional></li>
<li>		</dependency></li>
<li>		<dependency></li>
<li>			<groupId>org.springframework</groupId></li>
<li>			<artifactId>spring-beans</artifactId></li>
<li>			<version>3.0.5.RELEASE</version></li>
<li>			<optional>true</optional></li>
<li>		</dependency></li>
<li>		<dependency></li>
</ol>
This file has been truncated. show original
G

Lucas Cavalcanti:
só olhar no WEB-INF/lib… se só tiver o jar do guice, vc está usando ele :stuck_out_tongue:

pra usar o spring, se vc estiver usando o maven é  adicionar essas dependencias:

<aside class="onebox githubblob">
  <header class="source">
      <a href="https://github.com/caelum/vraptor/blob/master/vraptor-core/pom.xml#L73-L122%5B/quote%5D" target="_blank">github.com</a>
  </header>
  <article class="onebox-body">
    <h4><a href="https://github.com/caelum/vraptor/blob/master/vraptor-core/pom.xml#L73-L122%5B/quote%5D" target="_blank">caelum/vraptor/blob/master/vraptor-core/pom.xml#L73-L122</blockquote></a></h4>
<pre class="onebox"><code class="lang-xml"><ol class="start lines" start="73" style="counter-reset: li-counter 72 ;">
<li>		<!-- spring --></li>
<li>		<dependency></li>
<li>			<groupId>org.springframework</groupId></li>
<li>			<artifactId>spring-aop</artifactId></li>
<li>			<version>3.0.5.RELEASE</version></li>
<li>			<optional>true</optional></li>
<li>		</dependency></li>
<li>		<dependency></li>
<li>			<groupId>org.springframework</groupId></li>
<li>			<artifactId>spring-asm</artifactId></li>
<li>			<version>3.0.5.RELEASE</version></li>
<li>			<optional>true</optional></li>
<li>		</dependency></li>
<li>		<dependency></li>
<li>			<groupId>org.springframework</groupId></li>
<li>			<artifactId>spring-beans</artifactId></li>
<li>			<version>3.0.5.RELEASE</version></li>
<li>			<optional>true</optional></li>
<li>		</dependency></li>
<li>		<dependency></li>
</ol>
This file has been truncated. show original

Mas em qual projeto vc diz pra ver isso: vraptor-core ou no blank-project? No vraptor-core não tem nenhuma pasta WEB-INF e no pom dele tem as 2 dependências (guice e spring). Já o blank-project usa o guice, mas ele não é um projeto maven. Nesse caso como eu faço? É só baixar os jars do Spring e substituir?

Lucas_Cavalcanti

use esse projeto (o do meu livro =) )

entre em livraria-site, por exemplo, execute “ant resolve” e importe o projeto no eclipse.

se conseguir rodar ele normalmente, mude o ivy.xml para adicionar as dependencias do spring.

<dependency org="org.springframework" name="spring-aop" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-asm" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-beans" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-context" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-core" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-expression" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-web" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.aspectj" name="aspectjrt" rev="1.6.9" conf="default" />

depois execute “ant resolve”

G

Lucas Cavalcanti:
use esse projeto (o do meu livro =) )

entre em livraria-site, por exemplo, execute “ant resolve” e importe o projeto no eclipse.

se conseguir rodar ele normalmente, mude o ivy.xml para adicionar as dependencias do spring.

<dependency org="org.springframework" name="spring-aop" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-asm" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-beans" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-context" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-core" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-expression" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.springframework" name="spring-web" rev="3.0.5.RELEASE" conf="default" />
<dependency org="org.aspectj" name="aspectjrt" rev="1.6.9" conf="default" />

depois execute “ant resolve”

O “ant resolve” deu “build successful”, mas quando eu importo o projeto no Eclipse, aparecem alguns erros:

The project cannot be built until build path errors are resolved
Project ‘livraria-site’ is missing required source folder: 'src/test/resources’
Unbound classpath container: ‘JRE System Library [Java SE 6 (MacOS X Default)]’ in project 'livraria-site’
The method print(String) from the type JspWriter refers to the missing type String
The type java.io.Writer cannot be resolved. It is indirectly referenced from required .class files
java.lang.Exception cannot be resolved to a type
No exception of type ServletException can be thrown; an exception type must be a subclass of Throwable
java.io.IOException cannot be resolved to a type
Object cannot be resolved to a type
The method getPageContext(Servlet, ServletRequest, ServletResponse, String, boolean, int, boolean) from the type JspFactory refers to the missing type String

Eu tentei rodar mesmo assim. Eu consigo acessar arquivos estáticos, mas nenhuma URL que passa pelo back-end.

Lucas_Cavalcanti

vc precisa apontar para o java instalado na sua máquina

botão direito no projeto > Properties > Java Build Path > Libraries

Escolha a JRE System Library, clique em edit e escolha a do seu sistema

Assim ele deve resolver o problema.

G

Lucas Cavalcanti:
vc precisa apontar para o java instalado na sua máquina

botão direito no projeto > Properties > Java Build Path > Libraries

Escolha a JRE System Library, clique em edit e escolha a do seu sistema

Assim ele deve resolver o problema.

Já estava com a do meu sistema: jre7.

Lucas_Cavalcanti

Dá um clean no projeto e veja se os erros param

G

Não param.

Lucas_Cavalcanti

estranho…

Quais erros aparecem na aba de Errors/Warnings do projeto?

G

Lucas Cavalcanti:
estranho…

Quais erros aparecem na aba de Errors/Warnings do projeto?

Aqueles que eu citei:

The project cannot be built until build path errors are resolved
Project ‘livraria-site’ is missing required source folder: 'src/test/resources’
Unbound classpath container: ‘JRE System Library [Java SE 6 (MacOS X Default)]’ in project 'livraria-site’
The method print(String) from the type JspWriter refers to the missing type String
The type java.io.Writer cannot be resolved. It is indirectly referenced from required .class files
java.lang.Exception cannot be resolved to a type
No exception of type ServletException can be thrown; an exception type must be a subclass of Throwable
java.io.IOException cannot be resolved to a type
Object cannot be resolved to a type
The method getPageContext(Servlet, ServletRequest, ServletResponse, String, boolean, int, boolean) from the type JspFactory refers to the missing type String

Lucas_Cavalcanti

Project ‘livraria-site’ is missing required source folder: ‘src/test/resources’

-> crie essa pasta

Unbound classpath container: ‘JRE System Library [Java SE 6 (MacOS X Default)]’ in project ‘livraria-site’

-> siga os passos do build path que eu te falei, escolha a sua JRE, confirme e salve a escolha (Apply)

G

Lucas Cavalcanti:
Project ‘livraria-site’ is missing required source folder: ‘src/test/resources’

-> crie essa pasta

Unbound classpath container: ‘JRE System Library [Java SE 6 (MacOS X Default)]’ in project ‘livraria-site’

-> siga os passos do build path que eu te falei, escolha a sua JRE, confirme e salve a escolha (Apply)

Agora funcionou… Mas tá dando um erro quando inicio o servidor:

13-10-10 00:52:39,203 [ERROR] br.com.caelum.vraptor.scan.ScannotationComponentScanner - There’s no occurence of package br.com.caelum.vraptor.util.jpa in classpath
Out 10, 2013 12:52:39 AM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
com.google.inject.CreationException: Guice creation errors:

  1. No implementation for br.com.casadocodigo.livraria.site.modelo.Acervo was bound.
    while locating br.com.casadocodigo.livraria.site.modelo.Acervo
    for parameter 0 at br.com.casadocodigo.livraria.site.controlador.HomeController.(HomeController.java:13)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)
1 error

at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)

at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154)

at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)

at com.google.inject.Guice.createInjector(Guice.java:95)

at com.google.inject.Guice.createInjector(Guice.java:83)

at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:97)

at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)

at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)

at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)

at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)

at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)

at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:103)

at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)

at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)

at java.util.concurrent.FutureTask.run(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)</blockquote>
Lucas_Cavalcanti

Procure a classe AcervoNoAdmin e anote-a com @Component… se ela não existir, crie uma classe que implementa essa interface e deixe os métodos em branco.

G

Agora funcionou. Rodou o servidor certinho e iniciou a aplicação. A página /home/inicio não funcionou, lançou uma exceção, mas eu criei um novo método no HomeController e consegui acessar a página desse método.

Depois eu coloquei as dependências do Spring que você falou e dei ant resolve. O projeto continuou funcionando. Aí eu configurei a página de erro no web.xml, mas não consegui fazer funcionar esse mapeamento... Nessa versão do Vraptor também era assim?

<error-page>
   	<error-code>404</error-code>
	<location>/404</location>
</error-page>

...

<filter-mapping>
	<filter-name>vraptor</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>FORWARD</dispatcher>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>ERROR</dispatcher>
</filter-mapping>
Obs: eu não removi nenhuma dependência do Guice. Tem que remover?
Lucas_Cavalcanti

o que aconteceu? deu erro?

G

Não… Ele simplesmente ignora o mapeamento e mostra a mensagem de 404 padrão. Não consegui configurar nem pra estáticos.
Obs: eu adicionei os 3 dispatchers no web.xml. Antes não tinha nenhum.

Lucas_Cavalcanti

se vc colocar:

<error-page>  
    <error-code>404</error-code>  
    <location>/404.jsp</location>  
</error-page>

e colocar um arquivo 404.jsp dentro de src/main/webapp funciona?

G

Era isso mesmo… Eu tinha esquecido o .jsp… Agora funcionou.

Mas ainda não funciona quando eu direciono erro 404 pra URLs que vão ser tratadas por um controller.

Lucas_Cavalcanti

eu imaginei que não fosse funcionar mesmo… mas queria saber se naqueles debugs que vc tinha feito, o request ainda continuava mudando

G

Mas como eu testo isso só com o jar do vraptor?

Lucas_Cavalcanti

baixe os sources:
http://repo1.maven.org/maven2/br/com/caelum/vraptor/3.5.3/vraptor-3.5.3-sources.jar

mude o ivy.xml pra usar a versão 3.5.3 e rode o ant resolve

Properties do projeto > Java Build Path > Selecione o jar do vraptor > abra a setinha dele > Source attachment > Edit

escolha o jar dos sources.

Assim vc consegue fazer os breaks

G

Lucas Cavalcanti:
baixe os sources:
http://repo1.maven.org/maven2/br/com/caelum/vraptor/3.5.3/vraptor-3.5.3-sources.jar

mude o ivy.xml pra usar a versão 3.5.3 e rode o ant resolve

Properties do projeto > Java Build Path > Selecione o jar do vraptor > abra a setinha dele > Source attachment > Edit

escolha o jar dos sources.

Assim vc consegue fazer os breaks

Pronto. Mesma coisa: requisição diferentes nos 2 trechos.

Eu acabei de perceber um detalhe… Quando a requisição muda, ela volta a ser a requisição do dispatcher de FORWARD. É o mesmo id de instância e tudo.

Lucas_Cavalcanti

poxa vida…

só um último teste: abre a pasta src/main/webapp/WEB-INF/lib e remova o jar do guice

dê um clean no projeto e no servidor

e teste de novo.

O problema é que isso vai ser bem chato de resolver, se for o problema do requestInfo que eu to pensando =/

G

Lucas Cavalcanti:
poxa vida…

só um último teste: abre a pasta src/main/webapp/WEB-INF/lib e remova o jar do guice

dê um clean no projeto e no servidor

e teste de novo.

O problema é que isso vai ser bem chato de resolver, se for o problema do requestInfo que eu to pensando =/

É pra remover o guice-multibindings também?

Lucas_Cavalcanti

sim…

dê também um refresh no projeto, se vc apagou por fora do eclipse.

G

Lucas Cavalcanti:
sim…

dê também um refresh no projeto, se vc apagou por fora do eclipse.

Mesmo problema…

Lucas_Cavalcanti

bom… apelando pra servlet:

@WebServlet(urlPatterns="/404")
public void ErrorServlet extends HttpServlet {
   // implementa sua lógica no método service()
}

Se precisar acessar componentes, dá um toque, que tem um jeito.

adiciona uma issue por favor no VRaptor

G

Lucas Cavalcanti:
bom… apelando pra servlet:

@WebServlet(urlPatterns="/404")
public void ErrorServlet extends HttpServlet {
   // implementa sua lógica no método service()
}

Se precisar acessar componentes, dá um toque, que tem um jeito.

adiciona uma issue por favor no VRaptor
https://github.com/caelum/vraptor/issues

Issue cadastrada: https://github.com/caelum/vraptor/issues/577. Vê se faltou algo :wink:

Seria class ao invés de void, né? Mas tem uma coisa que eu não entendi: continuo com o mapeamento e o dispatcher de erro no web.xml?

Lucas_Cavalcanti

sim, é class =)

pode tirar o dispatcher de ERROR do VRaptor…

o @WebServlet supõe que vc esteja num ambiente servlet 3.0

G

Agora sim :slight_smile:
Obrigado pela ajuda, Lucas!

Lucas_Cavalcanti

=)

Desculpa não ter dado ainda com o VRaptor, em geral dá pra contornar esse tipo de situação… mas essa parte é meio tensa…

Obrigado pela paciência!

E se quiser ler mais sobre o VRaptor:
http://www.casadocodigo.com.br/products/livro-vraptor

Criado 8 de outubro de 2013
Ultima resposta 10 de out. de 2013
Respostas 54
Participantes 2
Casa do Codigo Casa do Codigo — Livros de tecnologia Livros de programacao, infraestrutura e inovacao
Lumina Lumina: a IA que te traz resultados Prompts prontos por especialistas. Resolva seus problemas de verdade.
Fiap Graduacao em Tecnologia — FIAP Analise e Desenvolvimento de Sistemas, Engenharia de Software e mais