[Resolvido] EncodingInterceptor no VRaptor3

15 respostas
wariows

Bom,

A partir do site do vraptor, baixei o blank project para eclipse e fiz assim:

IndexController.java
@Resource
public class IndexController {

	@Post
	@Path("/teste")
	public String index(String name) {
		return name;
	}
	
	@Get
	@Path("/")
	public void view() {
		
	}

}
InterceptorSequence.java
@Intercepts
public class InterceptorSequence implements
		br.com.caelum.vraptor.interceptor.InterceptorSequence {

	@Override
	public Class<? extends Interceptor>[] getSequence() {
		// TODO Auto-generated method stub
		return new Class[]{EncodingInterceptor.class};
	}

}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>VRaptor Blank Project</title>
</head>
<body>
	${string}
</body>
</html>
view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>VRaptor Blank Project</title>
</head>
<body>
	<form method="post" action="teste" >
		 <input type="text" name="name" />
		 <input type="submit" />
	</form>
</body>
</html>

Todo o código do interceptor é executado, mas o encoding não é modificado, o que me parece é que a request que chega no interceptor é diferente da request que vai pro controller...
Este problema só não ocorre quando o método utilizado é o GET, já que a url é codificada em utf-8 pelo próprio browser...

Utilizando a mesma ideia do interceptor em um Filter, funciona perfeitamente. O Spring disponibiliza um Filter já implementado para esse caso, basta fazer isso no web.xml:
<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

Mas sinceramente, acho mais fácil deixar o encoding padrão do vraptor como utf-8 (afinal é um character encoding mundialmente adotado como padrão) e caso alguém queria mudar, utiliza o filter, ou até mesmo um interceptor (se conseguirem identificar qual o problema ai). 2 linhas no filter do vraptor resolveriam o problema:

request.setCharacterEncoding("UTF-8");
			response.setCharacterEncoding("UTF-8");

15 Respostas

G

Na minha visão ele deveria herdar o encoding padão da aplicação. Ou para deixar mais flexível usar um parametro de web.xml na inicialização do vraptor3.

Paulo_Silveira

acho que a ideia do parametro por context, que o mario tinha enviado um patch, eh a melhor. forcar utf-8 de cara pode gerar problemas maiores ate as pessoas perceberem… ate porque, infelizmente, pessoal ainda cisma em usar iso 8859-1, que já nem mais suporte ha em manutencao.

sergiolopes

um detalhe aqui é que o encoding padrão do JSP pela spec é ISO8859-1.
eu fui dos contrarios a colocar coisas de encoding dentro do vraptor. quem deveria resolver é a aplicação

Lucas_Cavalcanti

E se for assim:

se houver um context-param no web.xml com nome
br.com.caelum.vraptor.encoding

o encoding é setado no começo da requisição com o valor dele… senão o VRaptor não faz nada

que acham?

wariows

lucascs:
E se for assim:

se houver um context-param no web.xml com nome
br.com.caelum.vraptor.encoding

o encoding é setado no começo da requisição com o valor dele… senão o VRaptor não faz nada

que acham?

+1

Lucas_Cavalcanti

Pronto, já está implementado e no repositório

wariows

Lucas,

Baixei e gerei o jar, mas acontece o seguinte erro:

Debuggei e constatei que a factory está registrada, se faço

ele me retorna uma instancia da factory, porém ele não consegue achar o bean nesta linha do VRaptor.java:

Lucas_Cavalcanti

Opa, esqueci de commitar um dos arquivos…

agora está funcionando

[]'s

wariows

Opa Lucas,

Acho que o git está bugado, o código que aparece no github é diferente do código que é baixado pelo download do github…

Acabei de baixar aqui, o código que o github devolve pelo botão ‘download’ é o com aquele patch antigo do encoding, onde utf-8 era o padrão…

Tá bugado ai também ou eu estou ficando doido?

[]'s

Lavieri

desculpa perguntar aqui mas… qual o link do repositorio ?

wariows

http://github.com/caelum/vraptor

Lucas_Cavalcanti

aqui também está acontecendo isso =(

baixa pelo git:

git clone git://github.com/caelum/vraptor.git

que funciona…

wariows

Baixei e compilei e quando executo dá isso:

java.lang.StringIndexOutOfBoundsException: String index out of range: 0 java.lang.String.charAt(Unknown Source) br.com.caelum.vraptor.vraptor2.Info.capitalize(Info.java:62) br.com.caelum.vraptor.http.asm.AsmBasedTypeCreator.typeFor(AsmBasedTypeCreator.java:84) br.com.caelum.vraptor.reflection.CacheBasedTypeCreator.typeFor(CacheBasedTypeCreator.java:54) br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:122) br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:116) br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:92) br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:71) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:39) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:74) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45) br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:39) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:35) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:58) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:59) br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:89) br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55) br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:86)

Estou executando um método sem parametros, o que parece é que ele encontra parametros para um método que não tem parametros…

[]'s

Lucas_Cavalcanti

qual jar do paranamer está no seu classpath?

a versão do paranamer foi atualizada, você tem que estar com a versão 1.5… paranamer-1.5.jar

wariows

Tudo funcionando lucas,

Vlw!

[]'s

Criado 8 de outubro de 2009
Ultima resposta 15 de out. de 2009
Respostas 15
Participantes 6