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