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

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$1614024553$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:

[code]public final class YearDTO
implements Serializable {

private Integer id;

private LocalDate startDate;

}[/code]

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

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

ou melhor: crie a seguinte classe:

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

lucas

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

garcia, e sua opiniao?

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í.

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

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

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

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?

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

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

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

[quote=lucascs]picocontainer…jar
reflections…jar
dom4j…jar
commons-vfs…jar[/quote]

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.