[BLOSSOM-161] Exception with use of the annotation-driven for Spring MVC Controller Created: 29/Jan/14  Updated: 17/Apr/15  Resolved: 31/Jan/14

Status: Closed
Project: Blossom
Component/s: None
Affects Version/s: 2.0.2
Fix Version/s: None

Type: Bug Priority: Neutral
Reporter: Jean-Charles Robert Assignee: Tobias Mattsson
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:
  • Magnolia 4.5.11
  • Spring 3.2.4.RELEASE
  • Maven 3.0.4
  • Java 1.7
  • Jetty Maven Plugin 6.1.5
  • Windows 7 - 64Bit
  • IDE IntelliJ Idea 12

Issue Links:
relation
is related to BLOSSOM-162 Add example of using @Valid to sample Closed
Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:

 Description   

I would like to use the @Valid annotation in order to validate my formular fields with annotations (@NotNull, @Email...)
Therefor I added the <mvc:annotation-driven /> in my blossom.servlet.xml to enable the annotation-driven Spring MVC Controller programming model.

I become this exception by page rendering:

14-01-29 10:51:53 ERROR AUTHOR[btpool0-7]info.magnolia.rendering.engine.ModeDependentRenderExceptionHandler: Error while rendering [/de/main] with template [module-de:pages/mainPage]: RenderException: org.springframework
.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [javax.jcr.Node]: Specified class is an interface
info.magnolia.rendering.engine.RenderException: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean c
lass [javax.jcr.Node]: Specified class is an interface
        at info.magnolia.module.blossom.render.BlossomTemplateRenderer.render(BlossomTemplateRenderer.java:86)
        at info.magnolia.rendering.engine.DefaultRenderingEngine.render(DefaultRenderingEngine.java:107)
        at info.magnolia.rendering.engine.DefaultRenderingEngine$$EnhancerByCGLIB$$96bbb6cf.render(<generated>)
        at info.magnolia.rendering.engine.RenderingFilter.render(RenderingFilter.java:190)
        at info.magnolia.rendering.engine.RenderingFilter.doFilter(RenderingFilter.java:113)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.module.blossom.preexecution.BlossomFilter.doFilter(BlossomFilter.java:84)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.module.softlocking.filters.SoftLockingFilter.doFilter(SoftLockingFilter.java:164)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.rendering.model.ModelExecutionFilter.doFilter(ModelExecutionFilter.java:107)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.InterceptFilter.doFilter(InterceptFilter.java:130)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.AggregatorFilter.doFilter(AggregatorFilter.java:103)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:60)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.RepositoryMappingFilter.doFilter(RepositoryMappingFilter.java:101)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:67)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:77)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:67)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.VirtualUriFilter.doFilter(VirtualUriFilter.java:70)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.module.cache.executor.Bypass.processCacheRequest(Bypass.java:58)
        at info.magnolia.module.cache.executor.CompositeExecutor.processCacheRequest(CompositeExecutor.java:66)
        at info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:153)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:76)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:84)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:60)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.module.extendedtemplatingkit.filters.CrossSiteSecurityFilter.doFilter(CrossSiteSecurityFilter.java:104)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:86)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:93)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.module.templatingkit.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:106)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.module.extendedtemplatingkit.filters.MultiSiteFilter.doFilter(MultiSiteFilter.java:106)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:73)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:85)
        at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:93)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:52)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.UnicodeNormalizationFilter.doFilter(UnicodeNormalizationFilter.java:90)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.CosMultipartRequestFilter.doFilter(CosMultipartRequestFilter.java:91)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.module.devicedetection.filter.DeviceDetectionFilter.doFilter(DeviceDetectionFilter.java:73)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:61)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:102)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:131)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:83)
        at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:67)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:91)
        at info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:108)
        at info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67)
        at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:108)
        at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:94)
        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:712)
        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
        at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:211)
        at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
        at org.mortbay.jetty.Server.handle(Server.java:313)
        at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
        at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
        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:381)
        at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
        at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
Caused by: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [javax.jcr.Node]: Specified clas
s is an interface
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
        at info.magnolia.module.blossom.render.BlossomDispatcherServlet.forward(BlossomDispatcherServlet.java:124)
        at info.magnolia.module.blossom.render.BlossomTemplateRenderer.render(BlossomTemplateRenderer.java:78)
        ... 147 more
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [javax.jcr.Node]: Specified class is an interface
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:102)
        at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:136)
        at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
        at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:101)
        at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)
        at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:123)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
        ... 152 more
  • It seems that in the @RequestMapping method, the Node page and Node content are not resolved.
  • I read too that "with Spring 3.0, this annotation-driven tag works in Servlet MVC only!". Is the Blossom Servlet able to do it correctly too?
    Did I miss something in my configuration?
    Or how can the Blossom Servlet resolve this nodes?
  • Blossom version 2.0.2 with spring 3.2.4.RELEASE

Here is my configuration file

blossom-servlet.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

  <context:annotation-config/>
  <mvc:annotation-driven />

  <context:component-scan base-package="com.aperto.bos" use-default-filters="false">
    <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.Template"/>
    <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.Area"/>
    <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.DialogFactory"/>
    <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.VirtualURIMapper"/>
  </context:component-scan>

  <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolver">
      <bean class="info.magnolia.module.blossom.web.BlossomWebArgumentResolver" />
    </property>
  </bean>
  <bean class="info.magnolia.module.blossom.preexecution.BlossomHandlerMapping">
    <property name="targetHandlerMappings">
      <list>
        <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
          <property name="useDefaultSuffixPattern" value="false" />
        </bean>
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
      </list>
    </property>
  </bean>
  <bean class="info.magnolia.module.blossom.view.UuidRedirectViewResolver">
    <property name="order" value="1" />
  </bean>

  <!-- JSP - renders all views that end with .jsp -->
  <bean class="info.magnolia.module.blossom.view.TemplateViewResolver">
    <property name="order" value="2"/>
    <property name="prefix" value="/templates/module/"/>
    <property name="viewNames" value="*.jsp"/>
    <property name="viewRenderer">
      <bean class="info.magnolia.module.blossom.view.JspTemplateViewRenderer"/>
    </property>
  </bean>

  <!-- Freemarker - renders all views that end with .ftl -->
  <bean class="info.magnolia.module.blossom.view.TemplateViewResolver">
    <property name="order" value="3"/>
    <property name="cache" value="false"/>
    <property name="prefix" value="/templates/module/"/>
    <property name="viewNames" value="*.ftl"/>
    <property name="viewRenderer">
      <bean class="info.magnolia.module.blossom.view.FreemarkerTemplateViewRenderer">
        <property name="contextAttributes">
          <map>
            <entry key="cms">
              <bean class="info.magnolia.rendering.renderer.ContextAttributeConfiguration">
                <property name="name" value="cms"/>
                <property name="componentClass" value="info.magnolia.templating.freemarker.Directives"/>
              </bean>
            </entry>
            <entry key="cmsfn">
                <bean name="templatingFuntions" class="info.magnolia.rendering.renderer.ContextAttributeConfiguration">
                  <property name="name" value="cmsfn"/>
                  <property name="componentClass" value="info.magnolia.templating.functions.TemplatingFunctions"/>
                </bean>
            </entry>
            <entry key="stkfn">
              <bean class="info.magnolia.rendering.renderer.ContextAttributeConfiguration">
                <property name="name" value="cmsfn"/>
                <property name="componentClass" value="info.magnolia.module.templatingkit.functions.STKTemplatingFunctions"/>
              </bean>
            </entry>
          </map>
        </property>
      </bean>
    </property>
  </bean>


</beans>

Thank you for your help.



 Comments   
Comment by Jean-Charles Robert [ 29/Jan/14 ]

Ok I find a solution by using this code instead of registering my own AnnotationMethodHandlerAdapter explicitly as a bean.

    <mvc:annotation-driven>
      <mvc:argument-resolvers>
        <bean class="info.magnolia.module.blossom.web.BlossomWebArgumentResolver" />
      </mvc:argument-resolvers>
    </mvc:annotation-driven>

No exception anymore, but the view of my component is rendere instead of the all page...
I still don't know if the validation with @Valid is in some way compatible with the pre-execution of components in BloosmFilter

Comment by Tobias Mattsson [ 29/Jan/14 ]

Hi Jean-Charles,

<mvc:annotation-driven> is essentially a macro. It includes a number of beans, message converters, handler adapters etc. They're all configured with reasonable defaults that suits the majority of users. That is, until you actually need something that differs from the defaults.

Blossom changes and customizes some things in order to find controllers to export. Using <mvc:annotation-driven> will break this and Blossom won't work anymore.

To get @Valid working you have to configure yourself what <mvc:annotation-driven> does to enable validation. Use following snippet:

  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolver">
      <bean class="info.magnolia.module.blossom.web.BlossomWebArgumentResolver" />
    </property>
    <property name="webBindingInitializer">
      <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
        <property name="validator">
          <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
        </property>
      </bean>
    </property>
  </bean>

Hope that helps, Tobias

Generated at Sun Feb 11 23:30:44 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.