Spring 3.1.1 проблема конфигурации FreeMarkerConfigurer на основе Java - PullRequest
2 голосов
/ 25 марта 2012

Я использую Spring 3.1.1 с Freemarker. После того, как мне удалось использовать новую концепцию Java-конфигурирования новой пружины 3.1. Сейчас я пытаюсь использовать Freemarker с ним. Однако я получил это исключение:

javax.servlet.ServletException: не удалось разрешить представление с именем '/ welcome' в сервлете с именем '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");
}

Ответы [ 3 ]

0 голосов
/ 30 апреля 2012
@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 голосов
/ 25 февраля 2015

Возможно, вы сделали неправильный импорт

import org.springframework.web.portlet.ModelAndView; 

вместо того, чтобы сделать это

import org.springframework.web.servlet.ModelAndView;
0 голосов
/ 27 апреля 2012

У меня такая же проблема, как и у вас.И я попытался включить уровень ведения журнала «DEBUG» для «org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer».Я нашел следующее сообщение:

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] .....

И проводной журнал от Jetty:

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 / "правильно тоже.Но я не уверен, что объект ServletContext из Spring такой же, как объект в обычной среде сервлета Java.

Я использую FreeMarker 2.3.19, Springframework 3.1.1.RELEASE и jetty-maven-плагин 7.4.5.v20110725 от Maven.

...