【问题标题】:Inernationalization with Spring Boot使用 Spring Boot 进行国际化
【发布时间】:2017-11-20 06:03:51
【问题描述】:

我想在我的 Spring Boot 项目中添加一个 messages_en_US 文件,并用它来填充 Freemarker 占位符。在以前的项目中,我自己设置配置(不在 Spring Boot 中的项目)它正在工作。

现在我在 /src/main/resources 文件夹下有 messages_en_US.properties 和 messages_pl.properties 文件,Spring 抛出异常:

----
FTL stack trace ("~" means nesting-related):
    - Failed at: ${springMacroRequestContext.getMessag...  [in template "spring.ftl" in macro "message" at line 28, column 22]
    - Reached through: @spring.message "title"  [in template "header.ftl" at line 17, column 9]
    - Reached through: #include "header.ftl"  [in template "index.ftl" at line 1, column 1]
----] with root cause

org.springframework.context.NoSuchMessageException: No message found under code 'title' for locale 'pl'.
    at org.springframework.context.support.DelegatingMessageSource.getMessage(DelegatingMessageSource.java:69) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:1232) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.REL
EASE]
    at org.springframework.web.servlet.support.RequestContext.getMessage(RequestContext.java:710) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.support.RequestContext.getMessage(RequestContext.java:676) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_66]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_66]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_66]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_66]
    at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1458) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.ext.beans.ReflectionCallableMemberDescriptor.invokeMethod(ReflectionCallableMemberDescriptor.java:52) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.ext.beans.MemberAndArguments.invokeMethod(MemberAndArguments.java:48) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.ext.beans.OverloadedMethodsModel.exec(OverloadedMethodsModel.java:62) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.MethodCall._eval(MethodCall.java:62) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Expression.eval(Expression.java:78) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Expression.evalAndCoerceToString(Expression.java:82) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.DollarVariable.accept(DollarVariable.java:41) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Environment.visit(Environment.java:324) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Macro$Context.runMacro(Macro.java:184) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Environment.invoke(Environment.java:701) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.UnifiedCall.accept(UnifiedCall.java:84) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Environment.visit(Environment.java:324) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.MixedContent.accept(MixedContent.java:54) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Environment.visit(Environment.java:324) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Environment.include(Environment.java:2072) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Include.accept(Include.java:167) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Environment.visit(Environment.java:324) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.MixedContent.accept(MixedContent.java:54) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Environment.visit(Environment.java:324) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.core.Environment.process(Environment.java:302) ~[freemarker-2.3.23.jar:2.3.23]
    at freemarker.template.Template.process(Template.java:325) ~[freemarker-2.3.23.jar:2.3.23]
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:367) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:284) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:234) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RE
LEASE]
    at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.REL
EASE]

来吧 Spring Boot! 我敢打赌,Spring Boot 已经有国际化 bean 的配置,我不应该手动设置它。我对吗? 也许我应该重命名我的消息文件或将其放入另一个目录?

【问题讨论】:

  • 您还必须在另一个 2 旁边有一个 messages.properties。您是仅使用自动配置还是手动设置?
  • 我也有 messages.properties 文件,但它是一个空文件。只要我们在谈论消息和国际化,我只使用自动配置。
  • 我实际上是指像免费标记这样的 MVC 部分,或者您是否为此使用 Spring Boot 配置?
  • 是的。一切都是由 Spring Boot 自动配置的,除了我覆盖的 Spring Security conf。

标签: java spring spring-boot


【解决方案1】:

好的,问题解决了。我必须添加 MessageSource bean conf。接下来,我将我的语言环境文件放在 /src/main/resources/locale 文件夹中。现在它起作用了。

消息源配置:

@Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("locale/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

【讨论】:

  • 这是一种解决方法而不是解决方案恕我直言。因为它应该只是作为 spring boot 自己注册一个。
【解决方案2】:
<#import "spring.ftl" as spring />

将此行添加到我的 freemarker 模板文件并将 spring.ftl 放入我的项目后,它工作正常。

取自:forum answer


另一种解决方案可能是添加到您的模型中:

String SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE = "springMacroRequestContext";
model.put(SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE,
                new RequestContext(request, response, 
                                            request.getSession().getServletContext()
                                            /*getServletContext()*/, model));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2023-03-13
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多