Spring - 获取所有可解析的消息密钥

Eer*_*nen 14 javascript java ajax spring spring-mvc

我有一个使用Spring MVC的Web应用程序.我希望我的界面只包含一个页面,它通过AJAX动态检索所有数据.我的问题是国际化.当我用jsps渲染内容时,我可以使用JSTL标记来解析我的键(使用Spring MVC非常容易):

<fmt:message key="name"/>: ${name}
<fmt:message key="title"/>: ${title}
<fmt:message key="group"/>: ${group}
Run Code Online (Sandbox Code Playgroud)

正确配置后,它将在芬兰语语言环境中呈现为

Nimi: yay
Otsikko: hoopla
Ryhmä: doo
Run Code Online (Sandbox Code Playgroud)

现在,当我使用json时,我只从服务器进来:

{
 name: "yay", 
 title: "hoopla",
 group: "doo"
}
Run Code Online (Sandbox Code Playgroud)

没有键名!但我必须以某种方式提供它们.我考虑将键名更改为其本地化表单或将本地化键名添加到json输出(例如name_localized ="Nimi"),但这两个选项都是不好的做法.我正在使用jackson json自动将我的域对象解析为json,我喜欢它提供的封装.

我想出的唯一可行的解​​决方案是:动态创建一个javascript文件,将本地化的键名作为变量.

<script type="text/javascript">
var name="Nimi";
var title="Otsikko";
var group="Ryhmä";
</script>
Run Code Online (Sandbox Code Playgroud)

一旦我加载了这个,我现在拥有我的javascript中的所有信息来处理json!但是有一个问题:我的字段名称列表是动态的.所以jsp中的实际静态渲染看起来像这样:

<c:forEach var="field" values="${fields}">
 <fmt:message key="${field.key}"/>: ${field.value}
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

我需要找到我的messages.properties中指定的所有消息.Spring MessageSource接口仅支持按键检索消息.如何获取JSP中的键名列表,这些键名称会呈现本地化的javascript变量?

Eer*_*nen 13

好吧,我通过扩展ResourceBundleMessageSource"解决"了我的问题.

package org.springframework.context.support;

import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;

public class ExposedResourceBundleMessageSource extends
        ResourceBundleMessageSource {
    public Set<String> getKeys(String basename, Locale locale) {
        ResourceBundle bundle = getResourceBundle(basename, locale);
        return bundle.keySet();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以访问密钥了,但除了必须指定消息源basename之外,我还必须在我的控制器中执行一个丑陋的强制转换.呃,这是很多耦合.

Set<String> keys = 
  ((ExposedResourceBundleMessageSource)
  messageSource).getKeys("messages", locale);
Run Code Online (Sandbox Code Playgroud)

  • 好吧,你可以通过将自定义消息源作为项目的默认值来清除一些丑陋.很难在评论中完全适应它,但在你的配置中``bean id ="messageSource"class ="com.yourproj.support.ExposedResourceBundleMessageSource">`然后在你的班级中使用`@Autowired private ExposedResourceBundleMessageSourcemessageSource;`. (2认同)
  • 对于那些寻找如何获取“Locale”的人,您可能需要使用“LocaleContextHolder.getLocale()”。这将获得绑定到线程的区域设置,这通常是您在 servlet/spring mvc 环境中想要的。 (2认同)

Viv*_*ath 0

我不认为返回本地化值是不好的做法。您可以从控制器返回类似的内容(因此您只需解析那里的键):

\n\n
{\n   name: {label: "Nimi", value: "yay"},\n   title: {label: "Ostikko", value: "hoopla"},\n   group: {label: "Rhym\xc3\xa4", value: "doo"},\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以创建一个保存这些值的中间对象(最简单的是Map<String, Map<String, String>>),jackson 会将其序列化为 JSON。我认为它比动态 Javascript 文件选项更好。无论如何,该解决方案最终也会执行您尝试对动态 Javascript 文件执行的操作,即将密钥与其解析值相关联。

\n