gpt4 book ai didi

java - Freemarker URLTemplate 加载器将国际化添加到模板名称和多个加载器不工作

转载 作者:行者123 更新时间:2023-11-30 06:55:52 25 4
gpt4 key购买 nike

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

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

这个类看起来像这样:

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;
}

Controller 就是这么简单:

ModelAndView view = new ModelAndView("index2");
return view;

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

URL Being used:http://10.0.0.5:8080/ftl/index2_en_US.ftl

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

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

最佳答案

FreeMarker 有一些不幸的遗留配置默认值,其中之一是 localized_lookup 默认为 true。这就是为什么它首先尝试查找 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>

关于java - Freemarker URLTemplate 加载器将国际化添加到模板名称和多个加载器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34818251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com