VRaptor3 - IllegalArgumentException: No enum const class HttpMethod.OPTIONS

Salve galera,

recentemente abri um post aqui no GUJ pra ver um problema na inicialização do VRaptor 3
http://guj.com.br/posts/list/15/204078.java

Nesse post o Lucas me instruiu a usar um jar da versão 3.1.3 dos snapshots.
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.3-SNAPSHOT/vraptor-3.1.3-20100511.225418-5.jar

Resolveu aquele problema perfeitamente.
Acontece que hoje começou a acusar outro erro, não está encontrando um Enum OPTIONS na classe HttpMethods

Segue o stackTrace:


java.lang.IllegalArgumentException: HTTP Method not known: OPTIONS
        at br.com.caelum.vraptor.resource.HttpMethod.of(HttpMethod.java:58)
        at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:51)
        at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:64)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
        at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
        at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
        at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at br.com.locaweb.tomcat.LocaWebValve.invoke(LocaWebValve.java:134)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:686)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalArgumentException: No enum const class br.com.caelum.vraptor.resource.HttpMethod.OPTIONS
        at java.lang.Enum.valueOf(Enum.java:192)
        at br.com.caelum.vraptor.resource.HttpMethod.valueOf(HttpMethod.java:31)
        at br.com.caelum.vraptor.resource.HttpMethod.of(HttpMethod.java:55)
        ... 26 more

Listando os Enuns de HttpMethod pelo Eclipse, realmente não existe esse valor na classe que está dentro do jar.

Baixei o último jar que tem no snapshot
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.3-SNAPSHOT/vraptor-3.1.3-20100607.234700-8.jar
e também não existe esse valor no Enum.

Alguma sugestão?

O Lucas respondeu em um outro tópico que o vraptor não suporta options: http://www.guj.com.br/posts/list/203491.java

isso acontece quando você faz uma chamada ajax, certo?
e uma chamada absoluta do tipo:

$.get('http://meudominio.com.br/blah.json',...);

Estou certo?

o que acontece eh que você não pode fazer chamadas ajax entre domínios diferentes se não usar jsonp…

eh algo do tipo:

  • na url vc vai ter que colocar ?callback=nomeDeUmaFuncao
  • vc vai precisar de uma função com o nome nomeDeUmaFuncao (ou um nome que faça mais sentido :wink: ) que vai processar o resultado da requisição
  • passar ‘jsonp’ como dataType (se vc estiver usando o jquery, $.ajax({…, dataType: ‘jsonp’, … }))

algo assim

Sim, realmente. Esse é o problema, na aplicação nós não utilizamos o método OPTIONS, só usamos GET’s e POST’s.

Não exatamente,
o servidor que está acontecendo o erro só serve alguns recursos para outros servidores nossos (e-mail e armazenamento de alguns arquivos) e também serve download dos arquivos para os usuários.

Quando o recurso é acessado pelos nossos servidores utilizamos um POST via HttpClient, e o download é um download comum pelo browser.
Existem algums ShellScripts que também acessam esse servidor para poder converter alguns arquivos, acessos esses que são feitos por wget para baixar o arquivo, e curl para enviar por POST o arquivo já convertido.
Nennhuma requisição ajax é feita para esse servidor.

Liguei agora o log do VRaptor em modo DEBUG e obtive o seguinte:

2010-06-15 10:34:49,539 [TP-Processor22] DEBUG  br.com.caelum.vraptor.VRaptor - VRaptor received a new request
2010-06-15 10:34:49,541 [TP-Processor22] DEBUG  br.com.caelum.vraptor.core.DefaultRequestExecution - executing stack  DefaultRequestExecution
2010-06-15 10:34:49,546 [TP-Processor22] DEBUG  br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler - Invoking interceptor ResourceLookupInterceptor
2010-06-15 10:34:49,546 [TP-Processor22] DEBUG  br.com.caelum.vraptor.http.DefaultResourceTranslator - trying to access /arquivo/

Essa thread 22 é a única que não tem o log “VRaptor ended the request” e a próxima linha depois do “trying to access /arquivo/” já é a exception que eu postei anteriormente.
E não existe nenhum método mapeado para essa URI e também nenhum lugar da aplicação requisita esse endereço.

como é a requisição que está dando esse problema? quem está fazendo e como está fazendo?

Ai que está.

Em nenhum lugar na aplicação é feita requisição pra esse endereço que acusou no log.
E como esse é um servidor de serviços, e nos servidores que são acessíveis pelos usuários a gente tem em média 9 requisições por segundo eu não consegui identificar de onde vem essa requisição.

Alguém está acessando esse /arquivos, senão não estaria aparecendo nos logs.

Alguém está acessando esse /arquivos, senão não estaria aparecendo nos logs.[/quote]

Concordo, está muito estranho isso.

no HttpCLient vc tá setando o método da requisição?

vc tah passando os parametros certos pro curl e pro wget?

Olá Lucas ,

Tenho esse problema quando uso o Ms-Excel para consumir informações via Web Query, consumo uma tabela simples em html, sou iniciante no VRaptor e gostaria de saber como faço para implementar esse método, pode dar uma dica?

Estou usando o VRaptor 3.4.0

java.lang.IllegalArgumentException: HTTP Method not known: OPTIONS
	at br.com.caelum.vraptor.resource.HttpMethod.of(HttpMethod.java:58)
	at br.com.vw.intercepts.Error404.tryMovePermanentlyTo(Error404.java:39)
	at br.com.vw.intercepts.Error404.couldntFind(Error404.java:28)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.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.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	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.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: No enum constant br.com.caelum.vraptor.resource.HttpMethod.OPTIONS
	at java.lang.Enum.valueOf(Unknown Source)
	at br.com.caelum.vraptor.resource.HttpMethod.valueOf(HttpMethod.java:31)
	at br.com.caelum.vraptor.resource.HttpMethod.of(HttpMethod.java:55)
	... 32 more

Atualiza pro VRaptor 3.5.1 ou 3.5.3…

esse método Options só foi implementado nessas versões.