Spring - viewResolver - JSP & Velocity

12 respostas
Kenobi

Caros, estou tendo problema ao setar o viewResolver do Velocity juntamente com do JSP.

Se deixo ambos funcionando, o viewResolver do Velocity perde o path e não acha o template.

Eu comento o viewResolver do JSP e tudo volta ao normal, o problema que eu não consigo processar minhas páginas com JSP.

Preciso fazer uma configuração em que ambos os cenários sejam atendidos, tanto JSP, quanto Velocity.

Minha configuração atual :

12 Respostas

Mauricio_Linhares

Porque você não usa o resource bundle view resolver?

Kenobi

Por que teria que alterar todas as minhas classes controllers, criar um bundle , com sua respectiva key.

Tenho muitos templates JSP que gostaria de chamar direto e não através do objeto ModelAndView, assim como alguns VM que chamo direto também.

Não sei como resolver a equação de ter dois controladores dessa maneira .

Mauricio_Linhares

Ainda bem que eu sempre usei o ResourceBundle :smiley:

O mais provável é que os dois estão tentando se “colocar” como view resolvers, só que só o primeiro consegue. Você já viu a documentação pra saber se ter dois view resolvers diferentes é possível?

Kenobi

Maurício Linhares:
Ainda bem que eu sempre usei o ResourceBundle :smiley:

O mais provável é que os dois estão tentando se “colocar” como view resolvers, só que só o primeiro consegue. Você já viu a documentação pra saber se ter dois view resolvers diferentes é possível?

A documentação não trata o tema, fala somente como configurar um e outro.

Não vi nada parecido, acredito que eu vou ter que substituir tudo para ResourceBundle mesmo.

Só uma pergunta, como o resolver irá interpretar nas diferentes extensões - VM e JSP ? Ele irá instanciar o velocity config de que forma ?

Mauricio_Linhares

Rapaz, exatamente agora eu não tenho como dizer com certeza, mas se eu não me engano basta ocnfigurar uma VelocityEngine factory do Spring e quando for uma view do Velocity o view resolver vai pegar essa factory e rodar a view.

Usar o ResourceBundle é muiiiiiiiiiito mais simples.

Kenobi

Maurício Linhares:
Rapaz, exatamente agora eu não tenho como dizer com certeza, mas se eu não me engano basta ocnfigurar uma VelocityEngine factory do Spring e quando for uma view do Velocity o view resolver vai pegar essa factory e rodar a view.

Usar o ResourceBundle é muiiiiiiiiiito mais simples.

stou com um probleminha ao setar via resourcebundle meu VelocityView …

Estou tomando um pau -

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fileTypeForm' defined in null: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'url' of bean class [org.springframework.web.servlet.view.velocity.VelocityViewResolver]: Bean property 'url' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:734)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:526)
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:357)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147)
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:262)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:331)
    org.springframework.web.servlet.view.ResourceBundleViewResolver.initFactory(ResourceBundleViewResolver.java:202)
    org.springframework.web.servlet.view.ResourceBundleViewResolver.loadView(ResourceBundleViewResolver.java:14
    org.springframework.web.servlet.view.AbstractCachingViewResolver.createView(AbstractCachingViewResolver.java:146)
    org.springframework.web.servlet.view.AbstractCachingViewResolver.resolveViewName(AbstractCachingViewResolver.java:79)
    org.springframework.web.servlet.DispatcherServlet.resolveViewName(DispatcherServlet.java:1011)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:970)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:764)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:681)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:395)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:349)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

Minha definição no spring-servlet para o resourcebundle:

<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
    <property name="basename" value="views"/>
    </bean>

    <!--
    This bean sets up the Velocity environment for us based on a root path for templates.
    Optionally, a properties file can be specified for more control over the Velocity
    environment, but the defaults are pretty sane for file based template loading.-->


    <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
    <property name="resourceLoaderPath">
    <value>/</value>
    </property>
    </bean>

Meu view properties

fileTypeForm.class=org.springframework.web.servlet.view.velocity.VelocityViewResolver
    fileTypeForm.url=jsp/consfiletype.vm
Mauricio_Linhares

Eu acho que o nome correto é VelocityView e não VelocityViewResolver :smiley:

Por isso que ele não tá achando a propriedade URL.

urubatan

multiplos view resolvers
http://www.urubatan.com.br/2004/11/10/viewresolvers_facilitando_a_configurao_do_spring_mvc.html

internacionalização, é só expor um objeto destes para o template e usar o getMessage dele
para fazer isto de forma automática é só configurar a propriedade requestContextAttribute do viewResolver

Kenobi

urubatan:
multiplos view resolvers
http://www.urubatan.com.br/2004/11/10/viewresolvers_facilitando_a_configurao_do_spring_mvc.html

internacionalização, é só expor um objeto destes para o template e usar o getMessage dele
para fazer isto de forma automática é só configurar a propriedade requestContextAttribute do viewResolver

Olá Uburatan, eu não estou internacionalizando, apenas quero redirecionar o view.

Quanto à property - <property name=“requestContextAttribute” value=“requestContext”/> eu coloquei tanto no viewResolver -

&lt;bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"&gt; &lt;property name="basename" value="views"/&gt; &lt;property name="requestContextAttribute" value="requestContext"/&gt; &lt;/bean&gt;

Quanto no FormBean, da outra vez, como mencinou. Em nenhum dos casos funciona, tomo pau - :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'viewResolver' defined in ServletContext resource [/WEB-INF/springapp-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'requestContextAttribute' of bean class [org.springframework.web.servlet.view.ResourceBundleViewResolver]: Bean property 'requestContextAttribute' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:734)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:526)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:357)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:262)
	org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:331)
	org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:150)
	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:307)
	org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:251)
	org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:220)
	org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:112)
	javax.servlet.GenericServlet.init(GenericServlet.java:211)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
	org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	java.lang.Thread.run(Thread.java:595)

Maurício, eu já tentei com quase todas as classes - VelocityView, VelocityViewResolver, VelocityLayoutView - aque chega mais próximo e tem um método setLayoutView, mas também não é público e não vai pelo view.properties.

Queria saber se alguém possui um xml pronto de configuração, ou uma aplicação que sample que use tanto velocity, quanto jsp, juntamente.

Grato,

Kenobi

urubatan

Kenobi:
urubatan:
multiplos view resolvers
http://www.urubatan.com.br/2004/11/10/viewresolvers_facilitando_a_configurao_do_spring_mvc.html

internacionalização, é só expor um objeto destes para o template e usar o getMessage dele
para fazer isto de forma automática é só configurar a propriedade requestContextAttribute do viewResolver

Olá Uburatan, eu não estou internacionalizando, apenas quero redirecionar o view.

Quanto à property - <property name=“requestContextAttribute” value=“requestContext”/> eu coloquei tanto no viewResolver -

&lt;bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"&gt; &lt;property name="basename" value="views"/&gt; &lt;property name="requestContextAttribute" value="requestContext"/&gt; &lt;/bean&gt;

Quanto no FormBean, da outra vez, como mencinou. Em nenhum dos casos funciona, tomo pau - :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'viewResolver' defined in ServletContext resource [/WEB-INF/springapp-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'requestContextAttribute' of bean class [org.springframework.web.servlet.view.ResourceBundleViewResolver]: Bean property 'requestContextAttribute' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:734)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:526)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:357)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:262)
	org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:331)
	org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:150)
	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:307)
	org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:251)
	org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:220)
	org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:112)
	javax.servlet.GenericServlet.init(GenericServlet.java:211)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
	org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	java.lang.Thread.run(Thread.java:595)

Maurício, eu já tentei com quase todas as classes - VelocityView, VelocityViewResolver, VelocityLayoutView - aque chega mais próximo e tem um método setLayoutView, mas também não é público e não vai pelo view.properties.

Queria saber se alguém possui um xml pronto de configuração, ou uma aplicação que sample que use tanto velocity, quanto jsp, juntamente.

Grato,

Kenobi


que versão do spring tu ta usando?
e se tu olhar o link que eu passei, esta propriedade esta definida no UrlBasedViewResolver, por tanto não existe para ResourcebundleViewResolver, mas ela existe para o VelocityViewResolver

Kenobi

Esse é meu problema, pq com o viewResolver do Velocity sozinho, eu nem preciso dessa propriedade, funciona belezinha.

Agora como faço para ter 2 viewResolvers simultanemamente ? A solução mais próxima, seria usar um ResouceBundlle, mas eu não estou conseguindo setar a url para o viewResolver do velocity, pq o mesmo não implementa, não descende da classe UrlBasedViewResolver.

Bom, queria saber como é a implementação padrão, antes de eu perder a paciência e escrever um resolver específico para cobrir essa questão e acabar perdendo a compatibildidade com o Framework - formato original de distribuição.

PS: O projeto que estou envolvido, será usado em diversos países, logo preciso estar aderente o mais próximo possível às especificações oficiais.

Kenobi

Kenobi:
Esse é meu problema, pq com o viewResolver do Velocity sozinho, eu nem preciso dessa propriedade, funciona belezinha.

Agora como faço para ter 2 viewResolvers simultanemamente ? A solução mais próxima, seria usar um ResouceBundlle, mas eu não estou conseguindo setar a url para o viewResolver do velocity, pq o mesmo não implementa, não descende da classe UrlBasedViewResolver.

Bom, queria saber como é a implementação padrão, antes de eu perder a paciência e escrever um resolver específico para cobrir essa questão e acabar perdendo a compatibildidade com o Framework - formato original de distribuição.

PS: O projeto que estou envolvido, será usado em diversos países, logo preciso estar aderente o mais próximo possível às especificações oficiais.

Bom galera, a solução foi uma miscelânia de configurações, agradeço à ambos o auxílio.

O ViewResolver do Velocity não herda a classe UrlBasedViewResolver na sua hierarquia, por isso estava tomando pau, tentando setar a url.

A saída para o problema é utilizar a classe org.springframework.web.servlet.view.velocity.VelocityView

Eu já tinha feito o teste, aí entra a dica do Uburatan - requestContextAttribute isso torna realmente funcional.

Abaixo segue um exemplo do view.properties -

fileTypeShow.class=org.springframework.web.servlet.view.velocity.VelocityView
fileTypeShow.requestContextAttribute rc
fileTypeShow.url=/jsp/consfiletype.vm
fileTypeShow.exposeSessionAttributes true

Configuração no app-servlet.xml

&lt;bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"&gt;
		&lt;property name="basename" value="views"/&gt;
 &lt;/bean&gt; 

&lt;bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"&gt;
        &lt;property name="resourceLoaderPath"&gt;
            &lt;value&gt;/&lt;/value&gt;
        &lt;/property&gt;
&lt;/bean&gt;

Baõ é isso !! :slight_smile:

Criado 31 de março de 2006
Ultima resposta 6 de abr. de 2006
Respostas 12
Participantes 3