Freemarker URLTemplate 加载器向模板名称添加国际化并且多个加载器不起作用

mma*_*ran 3 java spring freemarker spring-mvc

我有一个 Spring MVC 应用程序,我正在尝试将 freemarker 作为视图解析器。我正在尝试设置它,以便它首先检查不同的服务器,然后在本地检查。这是相关的代码:

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
  <property name="preTemplateLoaders" ref="myTemplateLoader"/>
</bean>

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

    <bean id="myTemplateLoader" class="com.xxx.MyURLTemplateLoader">
        <property name="baseUrl" value="http://10.0.0.5:8080/ftl/"/>
    </bean>
Run Code Online (Sandbox Code Playgroud)

这个类看起来像这样:

public class MyURLTemplateLoader extends URLTemplateLoader  {

private String baseUrl;

@Override
protected URL getURL(String arg0){
    URL url = null;
    try {
        url = new URL(baseUrl+arg0);
        System.out.println("URL Being used:"+url.toString());
    } catch (Exception s) {
        s.printStackTrace();
    }
    return url;
}

public String getBaseUrl() {
    return baseUrl;
}

public void setBaseUrl(String baseUrl) {
    this.baseUrl = baseUrl;
}
Run Code Online (Sandbox Code Playgroud)

}

控制器就是这么简单:

ModelAndView view = new ModelAndView("index2");
return view;
Run Code Online (Sandbox Code Playgroud)

现在,当我运行它时,出现 404 错误。奇怪的是我在日志中得到了这个:

URL Being used:http://10.0.0.5:8080/ftl/index2_en_US.ftl
Run Code Online (Sandbox Code Playgroud)

那么为什么将“_en_US”添加到我的 URL 中呢?

此外,如果我删除 preTemplateLoaders,它工作正常,它可以很好地获取本地模板。但是添加URLTemplateLoader,不仅模板名加上了_en_US,在本地也找不到。

dde*_*any 5

FreeMarker 有一些不幸的遗留配置默认值,其中之一localized_lookup是 default true。这就是为什么它首先尝试 find index2_en_US.ftl,然后如果缺少index2_en.ftl,则最后index2.ftl。另外,显然TemplateLoader您使用的实现findTemplateSource方法不正确,因此上述回退机制不起作用。因此,findTemplateSource应该是固定的,并且您还想关闭本地化查找:

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  ...
  <property name="freemarkerSettings">
    <props>
      <prop key="localized_lookup">false</prop>
      <!-- Some unrelated but useful default overrides: -->
      <prop key="incompatible_improvements">2.3.23</prop>
      <prop key="template_exception_handler">rethrow</prop>
      <prop key="log_template_exceptions">false</prop>
      <prop key="default_encoding">UTF-8</prop>
    </props>
  </property>
</bean>
Run Code Online (Sandbox Code Playgroud)