https://issues.apache.org/jira/browse/TAP5-328 seems to be back. :-(
Atenciosamente, Matheus Eduardo Machado Moreira matheus....@gmail.com *Good cooking takes time. If you are made to wait, it is to serve you better, and to please you.* Menu do Restaurant Antoine, New Orleans 2010/12/27 Matheus Eduardo Machado Moreira <matheus....@gmail.com> > I tried to resurrect a thread to ask questions regarding > ValidationDecorator and Bean Validation integration but now I think that was > not the best approach, so I decided to start a new thead. > > I'm trying to write a custom ValidationDecorator that must meet the > following requirements: > > - Render a decoration (e.g.: an *) in front of the label of every > required field > - The decoration must be displayed with the same style as the label's > text (e.g.: red when the label's field is in error) > - The ValidationDecorator must work together with Bean Validation > integration > > I already searched the past messages but could find nothing that could > help with the third requirement. This is where I'm stuck now. I've written a > couple of versions of my ValidationDecorator. The last setup is as follow: > > *RequiredFieldValidationDecorator.java* > > /** > * Decorates the DefaultValidationDecorator and render a "required > decoration" in front > * of the label's text. > */ > public class RequiredFieldValidationDecorator extends > BaseValidationDecorator { > > private String decoration; > private ValidationDecorator decorated; > > public RequiredFieldValidationDecorator(String decoration > , Environment environment, Asset spacerAsset, MarkupWriter > markupWriter) { > > this.decoration = decoration; > this.decorated = new DefaultValidationDecorator(environment, > spacerAsset, markupWriter); > } > > @Override > public void beforeField(Field field) { > decorated.beforeField(field); > } > > @Override > public void insideField(Field field) { > decorated.insideField(field); > } > > @Override > public void afterField(Field field) { > decorated.afterField(field); > } > > @Override > public void beforeLabel(Field field) { > decorated.beforeLabel(field); > } > > @Override > public void insideLabel(Field field, Element labelElement) { > decorated.insideLabel(field, labelElement); > if (field != null && field.isRequired()) { > labelElement.text(decoration); > } > } > > @Override > public void afterLabel(Field field) { > decorated.afterLabel(field); > } > > } > > *AppModule.java* > > public static void > contributeBeanValidatorSource(OrderedConfiguration<BeanValidatorConfigurer> > configuration) { > configuration.add("ConfiguradorBeanValidator", new > BeanValidatorConfigurer() { > public void configure(javax.validation.Configuration<?> > configuration) { > configuration.ignoreXmlConfiguration(); > } > }); > } > > public static void > contributeComponentMessagesSource(OrderedConfiguration<Resource> > configuration > , @ClasspathProvider AssetFactory classpathAssetFactory) { > > Resource root = classpathAssetFactory.getRootResource(); > Resource tapestryBeanValidationCatalog = > root.forFile("TapestryBeanValidationMessages_pt_BR.properties"); > > // TODO seria necessário indicar a restrição de posicionamento (after:, > before:) > // mas ainda não consigo determinar qual a restrição correta. :( > configuration.add("TapestryBeanValidationCatalog", > tapestryBeanValidationCatalog); > } > > public void > contributeMarkupRenderer(OrderedConfiguration<MarkupRendererFilter> > configuration > , final Environment environment, @Path("${tapestry.spacer-image}") > final Asset spacerImage) { > > MarkupRendererFilter requiredFieldValidationDecorator = new > MarkupRendererFilter() { > @Override > public void renderMarkup(MarkupWriter writer, MarkupRenderer > renderer) { > ValidationDecorator decorator = new > RequiredFieldValidationDecorator(" *", environment, spacerImage, writer); > > environment.push(ValidationDecorator.class, decorator); > renderer.renderMarkup(writer); > environment.pop(ValidationDecorator.class); > } > }; > > configuration.override("DefaultValidationDecorator", > requiredFieldValidationDecorator, "after:Heartbeat"); > } > > public void > contributePartialMarkupRenderer(OrderedConfiguration<PartialMarkupRendererFilter> > configuration > , final Environment environment, @Path("${tapestry.spacer-image}") > final Asset spacerImage) { > > PartialMarkupRendererFilter requiredFieldValidationDecorator = new > PartialMarkupRendererFilter() { > @Override > public void renderMarkup(MarkupWriter writer, JSONObject reply, > PartialMarkupRenderer renderer) { > ValidationDecorator decorator = new > RequiredFieldValidationDecorator(" *", environment, spacerImage, writer); > > environment.push(ValidationDecorator.class, decorator); > renderer.renderMarkup(writer, reply); > environment.pop(ValidationDecorator.class); > } > }; > > configuration.override("DefaultValidationDecorator", > requiredFieldValidationDecorator, "after:Heartbeat"); > } > > When I access one of my pages (acesso/editarPermissao), the following > exception is displayed: > > 2010-12-27 17:40:28,779 [btpool0-1] ERROR > tapestry.render.br.com.eteg.cromoup.pages.acesso.EditarPermissao - Render > queue error in BeginRender[core/PropertyEditBlocks:textfield]: Class cannot > be null > org.apache.tapestry5.ioc.internal.util.TapestryException: Class cannot be > null [at > classpath:org/apache/tapestry5/corelib/pages/PropertyEditBlocks.tml, line 5] > at > org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.invoke(ComponentPageElementImpl.java:194) > at > org.apache.tapestry5.internal.structure.ComponentPageElementImpl$BeginRenderPhase.render(ComponentPageElementImpl.java:246) > at > org.apache.tapestry5.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:72) > at > org.apache.tapestry5.internal.services.PageRenderQueueImpl.render(PageRenderQueueImpl.java:127) > at > $PageRenderQueue_12d2952b2e3.render($PageRenderQueue_12d2952b2e3.java) > at > $PageRenderQueue_12d2952b2db.render($PageRenderQueue_12d2952b2db.java) > at > org.apache.tapestry5.internal.services.MarkupRendererTerminator.renderMarkup(MarkupRendererTerminator.java:37) > at > org.apache.tapestry5.beanvalidator.BeanValidatorModule$2.renderMarkup(BeanValidatorModule.java:133) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > br.com.eteg.cromoup.services.AppModule$3.renderMarkup(AppModule.java:98) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$28.renderMarkup(TapestryModule.java:2073) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$27.renderMarkup(TapestryModule.java:2055) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$26.renderMarkup(TapestryModule.java:2040) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$25.renderMarkup(TapestryModule.java:2026) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$24.renderMarkup(TapestryModule.java:2008) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$23.renderMarkup(TapestryModule.java:1989) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > $MarkupRenderer_12d2952b2e2.renderMarkup($MarkupRenderer_12d2952b2e2.java) > at > org.apache.tapestry5.internal.services.PageMarkupRendererImpl.renderPageMarkup(PageMarkupRendererImpl.java:47) > at > $PageMarkupRenderer_12d2952b2e0.renderPageMarkup($PageMarkupRenderer_12d2952b2e0.java) > at > org.apache.tapestry5.internal.services.PageResponseRendererImpl.renderPageResponse(PageResponseRendererImpl.java:67) > at > $PageResponseRenderer_12d2952b1f2.renderPageResponse($PageResponseRenderer_12d2952b1f2.java) > at > org.apache.tapestry5.internal.services.PageRenderRequestHandlerImpl.handle(PageRenderRequestHandlerImpl.java:64) > at > org.apache.tapestry5.services.TapestryModule$36.handle(TapestryModule.java:2326) > at > $PageRenderRequestHandler_12d2952b1f4.handle($PageRenderRequestHandler_12d2952b1f4.java) > at > $PageRenderRequestHandler_12d2952b1ee.handle($PageRenderRequestHandler_12d2952b1ee.java) > at > org.apache.tapestry5.internal.services.ComponentRequestHandlerTerminator.handlePageRender(ComponentRequestHandlerTerminator.java:48) > at > org.apache.tapestry5.services.InitializeActivePageName.handlePageRender(InitializeActivePageName.java:47) > at > $ComponentRequestHandler_12d2952b1ef.handlePageRender($ComponentRequestHandler_12d2952b1ef.java) > at > $ComponentRequestHandler_12d2952b1d3.handlePageRender($ComponentRequestHandler_12d2952b1d3.java) > at > org.apache.tapestry5.internal.services.PageRenderDispatcher.dispatch(PageRenderDispatcher.java:45) > at $Dispatcher_12d2952b1d5.dispatch($Dispatcher_12d2952b1d5.java) > at $Dispatcher_12d2952b1d0.dispatch($Dispatcher_12d2952b1d0.java) > at > org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:321) > at > org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > org.apache.tapestry5.services.TapestryModule$4.service(TapestryModule.java:984) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:974) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:90) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:80) > at > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:85) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:103) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > $RequestHandler_12d2952b1c7.service($RequestHandler_12d2952b1c7.java) > at > org.apache.tapestry5.services.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:272) > at > org.apache.tapestry5.internal.gzip.GZipFilter.service(GZipFilter.java:53) > at > $HttpServletRequestHandler_12d2952b1c9.service($HttpServletRequestHandler_12d2952b1c9.java) > at > org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) > at > $HttpServletRequestFilter_12d2952b1c6.service($HttpServletRequestFilter_12d2952b1c6.java) > at > $HttpServletRequestHandler_12d2952b1c9.service($HttpServletRequestHandler_12d2952b1c9.java) > at > org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:928) > at > $HttpServletRequestHandler_12d2952b1c9.service($HttpServletRequestHandler_12d2952b1c9.java) > at > $HttpServletRequestHandler_12d2952b1c4.service($HttpServletRequestHandler_12d2952b1c4.java) > at > org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:147) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) > at > org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) > at > org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > br.com.eteg.cromoup.springsecurity.filters.UltimoLoginFilter.doFilterInternal(UltimoLoginFilter.java:41) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) > at > org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) > at > org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) > at > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) > at > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) > at > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:722) > at > org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:404) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) > at org.mortbay.jetty.Server.handle(Server.java:324) > at > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) > at > org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:828) > at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514) > at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) > at > org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) > at > org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450) > Caused by: java.lang.IllegalArgumentException: Class cannot be null > at > org.hibernate.validator.metadata.BeanMetaDataCache.getBeanMetaData(BeanMetaDataCache.java:40) > at > org.hibernate.validator.engine.ValidatorImpl.getBeanMetaData(ValidatorImpl.java:726) > at > org.hibernate.validator.engine.ValidatorImpl.getConstraintsForClass(ValidatorImpl.java:153) > at > org.apache.tapestry5.internal.beanvalidator.BeanFieldValidator.render(BeanFieldValidator.java:84) > at > org.apache.tapestry5.internal.services.CompositeFieldValidator.render(CompositeFieldValidator.java:45) > at > org.apache.tapestry5.corelib.base.AbstractTextField.begin(AbstractTextField.java:175) > at > org.apache.tapestry5.corelib.base.AbstractTextField$MethodAccess_begin_12d2952b301.invoke(AbstractTextField$MethodAccess_begin_12d2952b301.java) > at > org.apache.tapestry5.internal.transform.RenderPhaseMethodWorker$Invoker.invoke(RenderPhaseMethodWorker.java:117) > at > org.apache.tapestry5.internal.transform.RenderPhaseMethodWorker$RenderPhaseMethodAdvice.advise(RenderPhaseMethodWorker.java:86) > at > org.apache.tapestry5.internal.services.AbstractComponentMethodInvocation.proceed(AbstractComponentMethodInvocation.java:86) > at > org.apache.tapestry5.corelib.base.AbstractTextField.beginRender(AbstractTextField.java) > at > org.apache.tapestry5.internal.structure.ComponentPageElementImpl$BeginRenderPhase.invokeComponent(ComponentPageElementImpl.java:239) > at > org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.invoke(ComponentPageElementImpl.java:186) > ... 113 more > 2010-12-27 17:40:28,806 [btpool0-1] ERROR > org.apache.tapestry5.services.TapestryModule.RequestExceptionHandler - > Processing of request failed with uncaught exception: Render queue error in > BeginRender[core/PropertyEditBlocks:textfield]: Class cannot be null > org.apache.tapestry5.internal.services.RenderQueueException: Render queue > error in BeginRender[core/PropertyEditBlocks:textfield]: Class cannot be > null [at > classpath:org/apache/tapestry5/corelib/pages/PropertyEditBlocks.tml, line 5] > at > org.apache.tapestry5.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:84) > at > org.apache.tapestry5.internal.services.PageRenderQueueImpl.render(PageRenderQueueImpl.java:127) > at > $PageRenderQueue_12d2952b2e3.render($PageRenderQueue_12d2952b2e3.java) > at > $PageRenderQueue_12d2952b2db.render($PageRenderQueue_12d2952b2db.java) > at > org.apache.tapestry5.internal.services.MarkupRendererTerminator.renderMarkup(MarkupRendererTerminator.java:37) > at > org.apache.tapestry5.beanvalidator.BeanValidatorModule$2.renderMarkup(BeanValidatorModule.java:133) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > br.com.eteg.cromoup.services.AppModule$3.renderMarkup(AppModule.java:98) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$28.renderMarkup(TapestryModule.java:2073) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$27.renderMarkup(TapestryModule.java:2055) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$26.renderMarkup(TapestryModule.java:2040) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$25.renderMarkup(TapestryModule.java:2026) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$24.renderMarkup(TapestryModule.java:2008) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > org.apache.tapestry5.services.TapestryModule$23.renderMarkup(TapestryModule.java:1989) > at > $MarkupRenderer_12d2952b2e5.renderMarkup($MarkupRenderer_12d2952b2e5.java) > at > $MarkupRenderer_12d2952b2e2.renderMarkup($MarkupRenderer_12d2952b2e2.java) > at > org.apache.tapestry5.internal.services.PageMarkupRendererImpl.renderPageMarkup(PageMarkupRendererImpl.java:47) > at > $PageMarkupRenderer_12d2952b2e0.renderPageMarkup($PageMarkupRenderer_12d2952b2e0.java) > at > org.apache.tapestry5.internal.services.PageResponseRendererImpl.renderPageResponse(PageResponseRendererImpl.java:67) > at > $PageResponseRenderer_12d2952b1f2.renderPageResponse($PageResponseRenderer_12d2952b1f2.java) > at > org.apache.tapestry5.internal.services.PageRenderRequestHandlerImpl.handle(PageRenderRequestHandlerImpl.java:64) > at > org.apache.tapestry5.services.TapestryModule$36.handle(TapestryModule.java:2326) > at > $PageRenderRequestHandler_12d2952b1f4.handle($PageRenderRequestHandler_12d2952b1f4.java) > at > $PageRenderRequestHandler_12d2952b1ee.handle($PageRenderRequestHandler_12d2952b1ee.java) > at > org.apache.tapestry5.internal.services.ComponentRequestHandlerTerminator.handlePageRender(ComponentRequestHandlerTerminator.java:48) > at > org.apache.tapestry5.services.InitializeActivePageName.handlePageRender(InitializeActivePageName.java:47) > at > $ComponentRequestHandler_12d2952b1ef.handlePageRender($ComponentRequestHandler_12d2952b1ef.java) > at > $ComponentRequestHandler_12d2952b1d3.handlePageRender($ComponentRequestHandler_12d2952b1d3.java) > at > org.apache.tapestry5.internal.services.PageRenderDispatcher.dispatch(PageRenderDispatcher.java:45) > at $Dispatcher_12d2952b1d5.dispatch($Dispatcher_12d2952b1d5.java) > at $Dispatcher_12d2952b1d0.dispatch($Dispatcher_12d2952b1d0.java) > at > org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:321) > at > org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > org.apache.tapestry5.services.TapestryModule$4.service(TapestryModule.java:984) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:974) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:90) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:80) > at > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:85) > at > org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:103) > at > $RequestHandler_12d2952b1d1.service($RequestHandler_12d2952b1d1.java) > at > $RequestHandler_12d2952b1c7.service($RequestHandler_12d2952b1c7.java) > at > org.apache.tapestry5.services.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:272) > at > org.apache.tapestry5.internal.gzip.GZipFilter.service(GZipFilter.java:53) > at > $HttpServletRequestHandler_12d2952b1c9.service($HttpServletRequestHandler_12d2952b1c9.java) > at > org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) > at > $HttpServletRequestFilter_12d2952b1c6.service($HttpServletRequestFilter_12d2952b1c6.java) > at > $HttpServletRequestHandler_12d2952b1c9.service($HttpServletRequestHandler_12d2952b1c9.java) > at > org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:928) > at > $HttpServletRequestHandler_12d2952b1c9.service($HttpServletRequestHandler_12d2952b1c9.java) > at > $HttpServletRequestHandler_12d2952b1c4.service($HttpServletRequestHandler_12d2952b1c4.java) > at > org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:147) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) > at > org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) > at > org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > br.com.eteg.cromoup.springsecurity.filters.UltimoLoginFilter.doFilterInternal(UltimoLoginFilter.java:41) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) > at > org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) > at > org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) > at > org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) > at > org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) > at > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) > at > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) > at > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:722) > at > org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:404) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) > at org.mortbay.jetty.Server.handle(Server.java:324) > at > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) > at > org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:828) > at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514) > at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) > at > org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) > at > org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450) > Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: Class > cannot be null [at > classpath:org/apache/tapestry5/corelib/pages/PropertyEditBlocks.tml, line 5] > at > org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.invoke(ComponentPageElementImpl.java:194) > at > org.apache.tapestry5.internal.structure.ComponentPageElementImpl$BeginRenderPhase.render(ComponentPageElementImpl.java:246) > at > org.apache.tapestry5.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:72) > ... 111 more > Caused by: java.lang.IllegalArgumentException: Class cannot be null > at > org.hibernate.validator.metadata.BeanMetaDataCache.getBeanMetaData(BeanMetaDataCache.java:40) > at > org.hibernate.validator.engine.ValidatorImpl.getBeanMetaData(ValidatorImpl.java:726) > at > org.hibernate.validator.engine.ValidatorImpl.getConstraintsForClass(ValidatorImpl.java:153) > at > org.apache.tapestry5.internal.beanvalidator.BeanFieldValidator.render(BeanFieldValidator.java:84) > at > org.apache.tapestry5.internal.services.CompositeFieldValidator.render(CompositeFieldValidator.java:45) > at > org.apache.tapestry5.corelib.base.AbstractTextField.begin(AbstractTextField.java:175) > at > org.apache.tapestry5.corelib.base.AbstractTextField$MethodAccess_begin_12d2952b301.invoke(AbstractTextField$MethodAccess_begin_12d2952b301.java) > at > org.apache.tapestry5.internal.transform.RenderPhaseMethodWorker$Invoker.invoke(RenderPhaseMethodWorker.java:117) > at > org.apache.tapestry5.internal.transform.RenderPhaseMethodWorker$RenderPhaseMethodAdvice.advise(RenderPhaseMethodWorker.java:86) > at > org.apache.tapestry5.internal.services.AbstractComponentMethodInvocation.proceed(AbstractComponentMethodInvocation.java:86) > at > org.apache.tapestry5.corelib.base.AbstractTextField.beginRender(AbstractTextField.java) > at > org.apache.tapestry5.internal.structure.ComponentPageElementImpl$BeginRenderPhase.invokeComponent(ComponentPageElementImpl.java:239) > at > org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.invoke(ComponentPageElementImpl.java:186) > ... 113 more > > *EditarPermissao.tml > > *<html > t:type="layoutEdicao" t:titulo="${message:titulo}" > t:caminho="${message:caminho-acesso-permissao}" > xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" > xmlns:p="tapestry:parameter"> > > <p:navegacao> > <a href="#" t:type="pageLink" > t:page="acesso/editarPermissao">${message:novaPermissao}</a> > | > <a href="#" t:type="eventLink" > t:event="canceled">${message:novaPesquisa}</a> > </p:navegacao> > > <p:edicao> > <form t:type="form" t:validate="permissao"> > <t:errors /> > > <t:beanEditor t:id="permissao" > exclude="version, id" > reorder="nome,descricao,grupo,interno"> > > <p:grupo> > <t:label for="agrupamento"/> > <select t:type="select" t:id="agrupamento" > blankLabel="${message:select-blank-label}" value="permissao.grupo" /> > </p:grupo> > > </t:beanEditor> > > <input type="submit" value="${rotuloSalvar}" /> > <a href="#" t:type="pageLink" t:page="acesso/listarPermissao" > t:mixins="confirmacaoAcao" > t:mensagemConfirmacao="confirmacao-cancelamento">${message:cancelar-label}</a> > </form> > </p:edicao> > > </html> > > *EditarPermissao.java* > > <html > t:type="layoutEdicao" t:titulo="${message:titulo}" > t:caminho="${message:caminho-acesso-permissao}" > xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" > xmlns:p="tapestry:parameter"> > > <p:navegacao> > <a href="#" t:type="pageLink" > t:page="acesso/editarPermissao">${message:novaPermissao}</a> > | > <a href="#" t:type="eventLink" > t:event="canceled">${message:novaPesquisa}</a> > </p:navegacao> > > <p:edicao> > <form t:type="form" t:validate="permissao"> > <t:errors /> > > <t:beanEditor t:id="permissao" > exclude="version, id" > reorder="nome,descricao,grupo,interno"> > > <p:grupo> > <t:label for="agrupamento"/> > <select t:type="select" t:id="agrupamento" > blankLabel="${message:select-blank-label}" value="permissao.grupo" /> > </p:grupo> > > </t:beanEditor> > > <input type="submit" value="${rotuloSalvar}" /> > <a href="#" t:type="pageLink" t:page="acesso/listarPermissao" > t:mixins="confirmacaoAcao" > t:mensagemConfirmacao="confirmacao-cancelamento">${message:cancelar-label}</a> > </form> > </p:edicao> > > </html> > > *Permissao.java* > > package br.com.eteg.cromoup.domain.acesso; > > import java.util.HashSet; > import java.util.Set; > > import javax.persistence.CascadeType; > import javax.persistence.Column; > import javax.persistence.Entity; > import javax.persistence.FetchType; > import javax.persistence.GeneratedValue; > import javax.persistence.GenerationType; > import javax.persistence.Id; > import javax.persistence.JoinColumn; > import javax.persistence.JoinTable; > import javax.persistence.ManyToMany; > import javax.validation.constraints.NotNull; > > import org.apache.commons.lang.ObjectUtils; > import org.springframework.roo.addon.entity.RooEntity; > import org.springframework.roo.addon.javabean.RooJavaBean; > import org.springframework.roo.addon.plural.RooPlural; > import org.springframework.roo.addon.tostring.RooToString; > > @RooJavaBean > @RooToString > @RooEntity > @RooPlural("permissoes") > @Entity > public class Permissao { > > @Id > @GeneratedValue(strategy = GenerationType.AUTO) > @Column(name = "id") > private Long id; > > @NotNull > @Column(unique = true) > private String nome; > > @NotNull > private String descricao; > private Boolean interno = Boolean.TRUE; > > @ManyToMany(cascade = CascadeType.ALL,fetch=FetchType.LAZY) > @JoinTable(name = "perfil_permissao", joinColumns = { @JoinColumn(name > = "permissao_id") }, inverseJoinColumns = { @JoinColumn(name = "perfil_id") > }) > private Set<Perfil> perfis = new HashSet<Perfil>(); > > private AgrupamentoPermissao grupo; > > public Long getId() { > return this.id; > } > > public void setId(Long id) { > this.id = id; > } > > @Override > public int hashCode() { > final int prime = 31; > int result = 1; > result = prime * result + ((getId() == null) ? 0 : > getId().hashCode()); > return result; > } > > @Override > public boolean equals(Object obj) { > if (this == obj) { > return true; > } > if (obj == null || getClass() != obj.getClass()) { > return false; > } > Permissao other = (Permissao) obj; > return ObjectUtils.equals(getId(), other.getId()); > } > } > > > Do you have any idea what is the best approach to make this > ValidationDecorator work together with Bean Validation integration? Thanks > you. > > Atenciosamente, > > Matheus Eduardo Machado Moreira > matheus....@gmail.com > > *Good cooking takes time. If you are made to wait, it is to serve you > better, and to please you.* > Menu do Restaurant Antoine, New Orleans > >