[prev in list] [next in list] [prev in thread] [next in thread] 

List:       tapestry-user
Subject:    Re: [5.2.4] Custom ValidationDecorator + Bean Validation integration
From:       Matheus Eduardo Machado Moreira <matheus.emm () gmail ! com>
Date:       2010-12-28 12:15:19
Message-ID: AANLkTi=8LrqrnA_gtpiszH1N2ybGz7UTA0fanT76K-cz () mail ! gmail ! com
[Download RAW message or body]


   https://issues.apache.org/jira/browse/TAP5-328 seems to be back. :-(

   Atenciosamente,

Matheus Eduardo Machado Moreira
matheus.emm@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.emm@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.emm@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
> 
> 



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic