VRaptor 3 beta 5 lançado

Olá pessoal,

o VRaptor 3 beta 5 foi lançado, com mudanças importantes na parte de validação.

o jeito de fazer validações ficou assim:

validator.add(new ValidationMessage("uma", "mensagem")); // jeito clássico continua igual, com suportes a parâmetros nas mensagens
validator.checking(new Validations() {{
    if (that(usuario != null, "usuario", "usuario.obrigatorio")) { // mensagens ficam depois da validação, e o that retorna se a validação passou
          that(usuario.getIdade() > 17, "usuario.idade", "usuario.menorDeIdade"); // usando validação booleana
          that(usuario.getRoles(), hasItem("ADMIN")); // usando validação via Hamcrest
    }
}});
validator.onErrorUse(Results.page()).of(LoginController.class).login(); // deve ser chamada ao final das validações, se houver erros, redireciona
                           //para o local indicado

por favor mandem feedback e sugestões, e qualquer dúvida postem aqui

[]'s

Gostaria antes de tudo de parabenizá-los por esse excelente trabalho. Acompanho o VRaptor desde a versão 2 e sempre gostei pela documentação e pela maneira inteligente de funcionamento.

Estou avaliando a utilização do VRaptor 3 em um projeto que está nos estágios iniciais de desenvolvimento, utilizando VRaptor, JSTL e JPA e JasperReports. Com isso, estou com algumas dúvidas e tenho algumas sugestões:

  • Não seria possível adicionar múltiplos paths a uma única lógica? eu imaginei algo como @Path("/test", “/test/”)

  • Tive um problema ao importar o vraptor-blank, o JSTL não funcionava no tomcat. Curiosamente, tive o mesmo problema na época que testei o VRpator 2. Resolvi subsituindo o jtsl.jar por um da versão 1.2 que peguei no JavaRanch.

  • Algo que observei é que na versão beta 5 foi adicionado o suporte a injetar o EntityManager do JPA. Isso funcionará utilizando um provider de forma standalone (no tomcat por exemplo)? Vai ser necessário implementar alguma coisa extra ou apenas o persistence.xml ? Seria legal colocar na documentação e forma de utilização desse recurso.

  • Existe alguma forma simples de integrar o JasperReports ao VRaptor?

Desde já agradeço pela atenção.

obrigado pelo feedback =)

No momento você só consegue fazer isso via RoutesConfigurations, como no final dessa página:
http://vraptor.caelum.com.br/documentacao/resources-rest/
Mas podemos fazer isso sim…

o jar do jstl é mais pra você conseguir compilar a aplicação e colocar em servidores como o jetty… dependendo do servidor é só apagar o jar…

Não é bem um suporte… é um exemplo de como você criaria o EntityManager com o VRaptor. Mas sim, a princípio é só ter um persistence.xml
com o nome do persistence-unit = “default”. Pegando o código, é possível mudá-lo e usar qual persistence-unit você quiser…
E sim, faltou a documentação disso… falha nossa…

Não tem nada pronto… mas é algo simples do tipo, dentro de uma lógica

@Path("/url/para/o/relatorio")
public InputStream geraRelatorio() {
     InputStream relatorio = //gera o relatorio
     return relatorio;
}

e o relatório será renderizado no browser (ou colocado para download)

mais uma vez, obrigado pelo feedback =)
[]'s

Estou tendo problemas ao utilizar o BigDecimalConverter.

O seguinte erro é exibido:

br.com.caelum.vraptor.http.InvalidParameterException: unable to parse expression 'pagamento.desconto'
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:161)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:126)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:102)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:54)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:58)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.sudipel.interceptor.JPAInterceptor.intercept(JPAInterceptor.java:23)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:51)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:58)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.core.URLParameterExtractorInterceptor.intercept(URLParameterExtractorInterceptor.java:45)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:70)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:57)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:71)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:71)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:99)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:37)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:97)
	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:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
Caused by: ognl.OgnlException: desconto [br.com.caelum.vraptor.VRaptorException: Unable to find converter for java.math.BigDecimal]
	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:152)
	... 39 more

O mais interessante é que eu criei meu converter com o conteúdo (idêntico) da classe br.com.caelum.vraptor.converter.BigDecimalConverter e funcionou. Seria algum bug?

hyr4x, vc tá com a última versão do vraptor?

você tá sobrescrevendo algum dos componentes do vraptor?

Estou usando a versão beta5.

Não que eu saiba… =P

o converter não estava sendo registrado :?

vou corrigir no source, obrigado =)