Vraptor3: Erro de conversão com o joda-time [resolvido]

12 respostas
G

Usando joda-time no vraptor estou com esse problema abaixo.

Pelo que noto aqui o "joda converter" está sendo registrado:
INFO: 16:28:54 INFO (PicoComponentRegistry.java:97) - Class being registered as @RequestScoped, since there is no Scope annotation class br.com.caelum.vraptor.converter.jodatime.LocalDateConverter
INFO: 16:28:54 DEBUG (PicoComponentRegistry.java:99) - Registering br.com.caelum.vraptor.converter.jodatime.LocalDateConverter as a request component
INFO: 16:28:54 DEBUG (PicoComponentRegistry.java:76) - Registering br.com.caelum.vraptor.converter.jodatime.LocalTimeConverter with br.com.caelum.vraptor.converter.jodatime.LocalTimeConverter
INFO: 16:28:54 INFO (PicoComponentRegistry.java:97) - Class being registered as @RequestScoped, since there is no Scope annotation class br.com.caelum.vraptor.converter.jodatime.LocalTimeConverter
INFO: 16:28:54 DEBUG (PicoComponentRegistry.java:99) - Registering br.com.caelum.vraptor.converter.jodatime.LocalTimeConverter as a request component
A mensagem de erro:
INFO: 16:32:06 DEBUG (AsmBasedTypeCreator.java:117) - Fields: [private esim.model.dto.YearDTO YearController$store$[telefone removido]$1.Year_]
INFO: 16:32:06 DEBUG (CacheBasedTypeCreator.java:55) - cached generic type for method {DefaultResourceMethod: esim.web.controller.management.YearController.store}
INFO: 16:32:06 DEBUG (OgnlParametersProvider.java:140) - [b]Applying year.startDate with [01/01/2001][/b]
INFO: 16:32:06 WARN (OgnlParametersProvider.java:162) - [b]unable to parse expression 'year.startDate'ognl.OgnlException: startDate[/b] [br.com.caelum.vraptor.VRaptorException: Unable to find converter for org.joda.time.LocalDate]
	at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:103)
	at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
	at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
	at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.ASTChain.setValueBody(ASTChain.java:227)
	at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
	at ognl.SimpleNode.setValue(SimpleNode.java:279)
	at ognl.Ognl.setValue(Ognl.java:737)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:142)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:116)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:92)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
A classe que recebe os parametros:
public final class YearDTO
    implements Serializable {

    private Integer id;

    private LocalDate startDate;
}

Além disso usando o pico para injeção e os jars estão no classpath.

12 Respostas

Lucas_Cavalcanti

Isso é um bug mesmo =(

pra contornar o bug, crie as classes:

@Convert(LocalDate.class)
public class MeuLocalDateConverter extends LocalDateConverter {
}

@Convert(LocalTime.class)
public class MeuLocalTimeConverter extends LocalTimeConverter {
}

o problema é que o registro dos converters do Joda time é opcional… e apesar dos converters terem sido registrados no pico, não foram adicionado na coleção de converters… =(

no Spring isso funciona normalmente… só no pico que dá esse problema…

vou corrigir isso
[]'s

Lucas_Cavalcanti

ou melhor: crie a seguinte classe:

@Component
@ApplicationScoped
public class CustomConverters extends DefaultConverters {
     public CustomConverters() {
         super();
         register(LocalDateConverter.class);
	 register(LocalTimeConverter.class);
     }
}
Paulo_Silveira

lucas

creio que os converted de joda time nao devam ser opcionais, e sim entrar como defaults, que acha?

garcia, e sua opiniao?

G

Paulo, na documentação diz que o joda é carregado apenas se os jars estiverem no classpath. Creio é a melhor opção, assim como é no hibernate. Atualmente não é assim que funciona? Penso que deixar padrão força o projeto ter joda.

Uma coisa que pensei outro dia, analisando a dependencia do commons-file-upload por causa do converter para upload de arquivos seria interessante ter uma forma de eu configurar o que eu quero subir. Assim como é para quando eu quero alterar o comportamento padrão do PathResolver basta eu escrever o meu path resolver.

Lucas, como há bugs em relação ao pico, hein? Estou usando ele porque o spring é muito grande e possui dependencias. Já que minha aplicação é only-web, preferi algo bem mais light.

Quanto ao joda… tenho nesse bean duas propriedades LocalDate. Notei que a primeira vez ele injeta, na segunda vez não. Então a exception é lançada. Vou fazer mais uns debugs alí.

Lucas_Cavalcanti

o PicoProvider tem mais bugs que o SpringProvider pq algumas coisas a gente tem que fazer na mão com o pico, e o spring já faz pra gente…

a regra é simples, qto mais código, mais bugs :wink:
e tem mais código da parte do VRaptor no Pico que no Spring…

eu já corrigi esse bug, de qqer forma, se quiser baixar a versão snapshot já vai estar correto

[]'s

G

Lucas, agora relendo meu post, deixe-me explicar melhor, pois acho que causei um mal entendido. Os bugs que me referia seria quanto ao Pico, e não na bridge entre vraptor e Pico.

Abraços

Lucas_Cavalcanti

ah… sem problemas…
desculpe se eu fui um pouco mal educado…

quanto ao pico ser menor, não é tão verdade…

se você usar o spring só como DI provider, vc só precisa do spring-core.jar, não precisa
daquele monte de complexidade (e poder) que o spring tem.

se você usar o pico como DI provider, você precisa do Pico, do reflections-api pra fazer
classpath scanning, e o reflections-api depende de mais uns 5 projetos…

sem contar que se você quiser no futuro usar qualquer coisa do spring, você consegue fazer
diretamente,

acho que vale a pena deixar com o spring como Provider…

[]'s

G

Lucas, coloquei o spring-core apenas. Porém creio que eu precise de mais alguns módulos:

Caused by: java.lang.ClassNotFoundException: org.springframework.web.context.request.RequestContextListener at com.sun.enterprise.loader.EJBClassLoader.findClassData(EJBClassLoader.java:738) at com.sun.enterprise.loader.EJBClassLoader.findClass(EJBClassLoader.java:628) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) ... 87 more

Há como subir o spring sem o web-context? Se bem que pensando, preciso do módulo web para trabalhar com sessions e afins, correto? Ou o próprio vraptor cuida disso?

Lucas_Cavalcanti

usa o jar do spring que vem com o blank-project…

e não, não precisa do módulo web do Spring… a menos que vc precise de algo muito específicodo spring…

pelo menos o blank-project não precisa dele, nem os projetos que a gente está desenvolvendo com o vraptor

[]s

G

Lucas, o jar que vem com o vraptor vem com todos os módulos do spring all-in-one. Tive que colocar os jars: aopalliance.jar, aspectjrt.jar, spring-aop.jar, spring-beans.jar, spring-context.jar, spring-core.jar, spring-web.jar. Ou seja, praticamente a mesma coisa que simplesmente colocar o spring-all.jar.

Migrando para o SpringProvider, quais os jars posso remover junto com o pico?

Abraços

Lucas_Cavalcanti

picocontainer…jar
reflections…jar
dom4j…jar
commons-vfs…jar

G

lucascs:
picocontainer…jar
reflections…jar
dom4j…jar
commons-vfs…jar

Removendo essas libs e colocando as libs do spring deu praticamente na mesma, e pelo menos fujo um pouco dos problemas do pico, hehe.

Abraços, e obrigado.

Criado 16 de outubro de 2009
Ultima resposta 17 de out. de 2009
Respostas 12
Participantes 3