2012-03-24 116 views
2

我使用Spring 3.1.1和Freemarker。 我成功地使用了新的spring 3.1的基於java的配置的新概念之後。 現在我嘗試使用Freemarker。 不過,我得到的例外:Spring 3.1.1基於java的FreeMarkerConfigurer配置問題

javax.servlet.ServletException:無法與名稱 與名稱的servlet「/歡迎 'appServlet' org.springframework.web.servlet.DispatcherServlet.render解決視圖(DispatcherServlet.java:1139) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:927) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) org.springframework。 web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

這裏是WebConfig:

package com.springway.config; 

@Configuration 
@ComponentScan("com.springway") 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Inject 
    private Environment environment; 

    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(new MappingJacksonHttpMessageConverter()); 
    } 

    @Bean 
    public ViewResolver viewResolver() { 
     UrlBasedViewResolver viewResolver = new UrlBasedViewResolver(); 
     viewResolver.setViewClass(FreeMarkerView.class); 
     return viewResolver; 
    } 

    @Bean 
    public FreeMarkerConfigurer freeMarkerConfigurer() { 

     FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); 
     configurer.setTemplateLoaderPath(
       "/WEB-INF/freemarker.xml"); 

     return configurer; 
    } 

freemarker.xml:

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

    <!-- freemarker config --> 
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
     <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/> 
     <property name="freemarkerSettings"> 
      <props> 
       <prop key="number_format">0.######</prop> 
      </props> 
     </property> 
     <property name="freemarkerVariables"> 
     <map> 
      <entry key="xml_escape" value-ref="fmXmlEscape"/> 
     </map> 
     </property> 
    </bean> 

    <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/> 


    <!-- 

     View resolvers can also be configured with ResourceBundles or XML files. If you need 
     different view resolving based on Locale, you have to use the resource bundle resolver. 

    --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
     <property name="cache" value="true"/> 
     <property name="prefix" value=""/> 
     <property name="suffix" value=".ftl"/> 
    </bean> 

</beans> 

控制器:

@RequestMapping(value="/", method=RequestMethod.GET) 
public ModelAndView home(Principal user) { 

return new ModelAndView("/welcome.ftl"); 
} 
+0

我已爲我的答案。我希望它能幫助你。 – Echo 2012-04-29 20:58:45

回答

0

我正在努力解決與您相同的問題。我試圖打開「org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer」的日誌級別「DEBUG」。我發現了以下消息:

java.io.FileNotFoundException: ServletContext resource [/WEB-INF/freemarker/] cannot be resolved to URL because it does not exist at org.springframework.web.context.support.ServletContextResource.getURL(ServletContextResource.java:154) ~[spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE] at org.springframework.web.context.support.ServletContextResource.getFile(ServletContextResource.java:169) ~[spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE] at org.springframework.ui.freemarker.FreeMarkerConfigurationFactory.getTemplateLoaderForPath(FreeMarkerConfigurationFactory.java:351) [spring-context-support-3.1.1.RELEASE.jar:3.1.1.RELEASE] at org.springframework.ui.freemarker.FreeMarkerConfigurationFactory.createConfiguration(FreeMarkerConfigurationFactory.java:304) [spring-context-support-3.1.1.RELEASE.jar:3.1.1.RELEASE] .....

而且從碼頭有線日誌:

WARN org.eclipse.jetty.util.log - /freemarker/

我不知道是什麼回事!因此,我用另一個名稱替換了「templateLoaderPath」的值,如「/ WEB-INF/tmpl-freemarker /」,然後一切都可行!

接下來,我試着用ServerContext.getResource()來測試「/WEB-INF/freemarker/html.ftl」。下面是結果:

Resource under /WEB-INF/freemarker/: null 

我的測試代碼:

@Inject 
private ServletContext servletContext; 

try { 
    logger.info("Resource under /WEB-INF/freemarker/: {}", servletContext.getResource("/WEB-INF/freemarker/html.ftl")); 
} catch(Exception e) { 
    logger.info("Exception while getResource", e); 
} 

看來ServletContext不能找出 「/ WEB-INF/freemarker的/」 正確要麼在資源。但是我不確定Spring的ServletContext的對象與Java Servlet的正常環境中的對象是否一樣。

我使用Maven的FreeMarker 2.3.19,Springframework 3.1.1.RELEASE和jetty-maven-plugin 7.4.5.v20110725。

0
@Configuration 
@EnableWebMvc 

@ImportResource("classpath:/security-integration.xml") 
@ComponentScan("com.springway") 
public class WebConfiguration extends WebMvcConfigurerAdapter { 

    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 


    @Bean 
    public FreeMarkerViewResolver viewResolver() { 
     FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver(); 
     freeMarkerViewResolver.setCache(true); 
     freeMarkerViewResolver.setPrefix(""); 
     freeMarkerViewResolver.setSuffix(".ftl"); 
     return freeMarkerViewResolver; 
    } 

    @Bean 
    public FreeMarkerConfigurer freemarkerConfig() { 
     FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); 
     freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/freemarker/"); 
     Properties settings = new Properties(); 
     settings.setProperty("number_format", "0.######"); 
     freeMarkerConfigurer.setFreemarkerSettings(settings); 
     Map variables = new java.util.HashMap<String, Object>(); 

     variables.put("xml_escape", new XmlEscape()); 
     freeMarkerConfigurer.setFreemarkerVariables(variables); 
     return freeMarkerConfigurer; 
    } 
} 
0

你可能做錯了進口

import org.springframework.web.portlet.ModelAndView; 

,而不是做這個

import org.springframework.web.servlet.ModelAndView;