Vraptor3: Resources rest no IE7 [resolvido]

14 respostas
G

Tenho uma aplicação onde possuo um crud bem básico:

@Get
    public void list(Paging paging);

    @Get
    public void edit(Long id);

    @Post
    public void store(BranchDTO branch);

    @Delete
    public void delete(BranchDTO branch);

E no meu JSP tenho assim:

<w:form action="/branch/" method="post">
	<button type="submit" name="_method" value="DELETE" class="delete">
		Excluir
	</button>

	<button type="submit" class="store">
		Salvar
	</button>
</w:form>

Em qualquer navegador decente funciona direitinho tanto o store quanto o delete. Porém no IE7 quando o botão Excluir é pressionado tenho a exception:

WARNING: StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: HTTP Method not known: Excluir
	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)

Caused by: java.lang.IllegalArgumentException: No enum const class br.com.caelum.vraptor.resource.HttpMethod.EXCLUIR
	at java.lang.Enum.valueOf(Enum.java:196)
	at br.com.caelum.vraptor.resource.HttpMethod.valueOf(HttpMethod.java:31)
	at br.com.caelum.vraptor.resource.HttpMethod.of(HttpMethod.java:55)

Pelo que eu notei o IE está enviando Excluir ao invés de DELETE no _method. Como contornar isso, já que só nesse pseudo-navegador que as coisas não funcionam? Obvio que eu cogitei usar Firefox, porém essa aplicação precisa ser acessada mesmo de qualquer navegador.

14 Respostas

Edufa

Assim não resolve?

&lt;input type="hidden" name="_method" value="DELETE" /&gt;
&lt;button type="submit" name="btnSubmit" class="delete"&gt;
G

Edufa:
Assim não resolve?

&lt;input type="hidden" name="_method" value="DELETE" /&gt;
&lt;button type="submit" name="btnSubmit" class="delete"&gt;

Não porque eu tenho várias operações, e não apenas delete. Dessa forma sempre que eu pressionar algum botão, por exemplo, store ele irá passar _method=delete.

Edufa

Entendi…

Aí neste caso, eu acho q vc teria de enfiar um javascript no meio que mexa no value do button, e mude o ‘excluir’ por ‘DELETE’, mas não sei se daria certo, o IE é um browser bem temperamental, melhorou bastante, mas continua chato.

G

Edufa:
Entendi…

Aí neste caso, eu acho q vc teria de enfiar um javascript no meio que mexa no value do button, e mude o ‘excluir’ por ‘DELETE’, mas não sei se daria certo, o IE é um browser bem temperamental, melhorou bastante, mas continua chato.

Hahaha, é verdade, muito temperamental pro meu gosto. Fazer a sua sugestão com Javascript, porém vou ver se dá para fazer algo diferente para que o IE envie corretamente esse campo. Poxa, até o browser do meu celular envia direito, só o IE que não, haha.

Valeu, Edufa.

Abraços

boneazul
garcia-jj:
Tenho uma aplicação onde possuo um crud bem básico:
@Get
    public void list(Paging paging);

    @Get
    public void edit(Long id);

    @Post
    public void store(BranchDTO branch);

    @Delete
    public void delete(BranchDTO branch);

E no meu JSP tenho assim:

<w:form action="/branch/" method="post">
	<button type="submit" name="_method" value="DELETE" class="delete">
		Excluir
	</button>

	<button type="submit" class="store">
		Salvar
	</button>
</w:form>

Em qualquer navegador decente funciona direitinho tanto o store quanto o delete. Porém no IE7 quando o botão Excluir é pressionado tenho a exception:

WARNING: StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: HTTP Method not known: Excluir
	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)

Caused by: java.lang.IllegalArgumentException: No enum const class br.com.caelum.vraptor.resource.HttpMethod.EXCLUIR
	at java.lang.Enum.valueOf(Enum.java:196)
	at br.com.caelum.vraptor.resource.HttpMethod.valueOf(HttpMethod.java:31)
	at br.com.caelum.vraptor.resource.HttpMethod.of(HttpMethod.java:55)

Pelo que eu notei o IE está enviando Excluir ao invés de DELETE no _method. Como contornar isso, já que só nesse pseudo-navegador que as coisas não funcionam? Obvio que eu cogitei usar Firefox, porém essa aplicação precisa ser acessada mesmo de qualquer navegador.

Seguinte jj-garcia em vez de usa a tag

R

Ae galera…

to com um problema bem parecido… desenvolvi uma aplicacao web e testei tudo no firefox, ótimo funciona perfeitamente…

porem qdo acesso ie, chrome e opera tenho alguns problemas.

tenho um metedo q o path é

@Get
@Path("/funcionario/atualizar/{funcionario.id}")

esse metodo carrega o funcionario para eu edita-lo por exemplo…

quando eu clico no link atravez do firefox ele chama o metodo normalmente… e tela é exibida com o form carregado…

porem nos outros navegadores, algumas vezes acessa, outras nao… e o mais engrecado q qdo nao carrega a tela, se eu do F5 ai a tela é carregada normalmente em todos navegadores…

tenho uma path assim

@Get
@Path("/{funcionario.id}")

parece q em algumas requisicoes esta caindo ai, indevidamente…

algo a comentar???

abs

G

Estranho, não sei muito bem o que dizer, afinal, nunca tive esse tipo de problema que você descreveu.

Mas já que o problema envolve F5, tente essa receita de bolo: http://vraptor.caelum.com.br/cookbook/evitando-que-o-browser-faca-cache-das-paginas/

R

blz garcia!

vou colocar esse interceptor e ve se resolve.

o que me deixa bravo é isso, funcionar tudo perfeitamente no Firefox e nos outros nao…

e o que me deixa mais bravo ainda haha é o fato que algumas requisicoes funcionam e outras nao, nos outros navegadores…

vou debugar melhor a noite, agora nao consigo mexer… :oops:

abs!

G

boneazul:
Seguinte jj-garcia em vez de usa a tag tenta usar o capaz que funcione em qualquer browser…
a muito tempo atras que programava o maldito php eu vinha sofrendo com varios problemas por causa dessa tag button …nao me lembro o porque…mas tenta trocar pra ver…

Tentei usar imagens, e sabe que agora piorou… nesse caso o IE nem mesmo envia o _method=DELETE. Já Firefox, opera e chromium fizeram certo.

:roll:

G

Fiz agora um javascript beeem gambiarrento que vê se é IE, caso sim ele cria um interceptor no clique de cada botão, e faz um setvalue em um hidden com o _method.

<w:form action="/branch/" method="post"> <w:hidden name="_method" value="" /> [...]

O problema que quando eu faço um submit normal, que não seja via _method=DELETE ou outro semelhante, o Vraptor estoura esse erro:

Caused by: java.lang.IllegalArgumentException: No enum const class br.com.caelum.vraptor.resource.HttpMethod. at java.lang.Enum.valueOf(Enum.java:196) at br.com.caelum.vraptor.resource.HttpMethod.valueOf(HttpMethod.java:31) at br.com.caelum.vraptor.resource.HttpMethod.of(HttpMethod.java:55)

Lucas, será que no HttpMethod.of na linha 48 podemos fazer algo como:

para

G

http://www.deanoj.co.uk/programming/javascript/fixing-the-internet-explorer-button-form-submission-bug/

Será que terei de apelar, e?! :roll:

G

Hmm, certo. Impressionante a quantidade de pequenas artimanhas que podemos fazer com um pouco de javascript.

if ($.browser.msie) { $('form *[name=\'_method\']').click(function() { $(this.form).prepend('<input type="hidden" name="_method" value="' + $(this).val() + '" />'); }); }

Isso resolveu para mim. Para todo e qualquer elemento dentro do form que tiver o name="_method", quando clicado, cria um campo hidden com o valor. Isso bate ± como o que o Edufa sugeriu, porém de forma mais automatica, haha.

:twisted: :twisted:

boneazul

garcia-jj:
boneazul:
Seguinte jj-garcia em vez de usa a tag tenta usar o capaz que funcione em qualquer browser…
a muito tempo atras que programava o maldito php eu vinha sofrendo com varios problemas por causa dessa tag button …nao me lembro o porque…mas tenta trocar pra ver…

Tentei usar imagens, e sabe que agora piorou… nesse caso o IE nem mesmo envia o _method=DELETE. Já Firefox, opera e chromium fizeram certo.

:roll:

realmente para imagem nao vai resolver seu problema… a tag button na verdade foi criada para poder colocar outras tags dentro como no seu caso de colocar uma imagem dentro de um botao…mas ela veio com esse bug e varios outros de querer dar submit no formulario…o que nao seria interessante caso voce precise de um terceiro botato que nao sejam reset ou submit…
aconselho voce a usar os dois em conjunto…

da pra remover borda,cor e afins

com isso voce simula a sua tag button sem sofrer com o problema que ela causa…ou usar o link ai de cima vai bem tambem…é menos trabalhoso utilizar o script…porem mais pesadinho toda ver tem q criar elemento dependendo de quantos buttons voce tem…

G

boneazul:
realmente para imagem nao vai resolver seu problema… a tag button na verdade foi criada para poder colocar outras tags dentro como no seu caso de colocar uma imagem dentro de um botao…mas ela veio com esse bug e varios outros de querer dar submit no formulario…o que nao seria interessante caso voce precise de um terceiro botato que nao sejam reset ou submit…
aconselho voce a usar os dois em conjunto…

da pra remover borda,cor e afins

com isso voce simula a sua tag button sem sofrer com o problema que ela causa…ou usar o link ai de cima vai bem tambem…é menos trabalhoso utilizar o script…porem mais pesadinho toda ver tem q criar elemento dependendo de quantos buttons voce tem…

:thumbup: Isso é verdade, notei quando resolvi fazer uns testes práticos. Pelas pesquisas que eu fiz o padrão é o browser pegar sempre o atributo value e enviar, e todos fazem assim. Porém apenas o IE faz um innerHTML da tag button e envia no formulário.

Mas a idéia do

aninhado com é boa também. Vou experimentar logo mais.
Criado 17 de junho de 2010
Ultima resposta 17 de jun. de 2010
Respostas 14
Participantes 4