【发布时间】:2015-04-29 07:01:37
【问题描述】:
我正在编写一个自定义 Spring Boot 启动器,其他开发人员将放入他们的应用程序,这个启动器包含开箱即用的控制器和 UI 屏幕。
这些 UI 屏幕是国际化的,并且 i18n 键/值位于包文件中:com/foo/wherever/i18n.properties。
我想确保当我的启动器在启动时加载时,这些 i18n.properties 自动在应用程序的MessageSource 中可用,以便我的 UI 页面正常工作(通过普通 Spring Controller + ViewResolver + View 实现呈现)无需应用程序开发人员自己指定此文件。
换句话说,他们应该能够将我的启动器添加到他们的运行时类路径中,并且一切都“正常工作”而无需配置任何东西。
现在,我发现应用开发者可以创建自己的src/main/resources/messages.properties文件手动配置application.properties中的附加消息文件:
spring.messages.basename = messages, com.foo.wherever.i18n
这会奏效。
但是,这需要以下两个条件:
- 他们必须手动配置
spring.messages.basename属性 - 这不是自动的。和 - 他们的应用程序类路径中必须有自己的
messages.properties文件。如果messages.properties文件不存在,spring.messages.basename甚至不起作用。即使他们不关心 i18n,这仍然是必需的 - 不可取。
我想我可以将我的 i18n.properties 文件移动到 starter .jar 中的 classpath:/messages.properties 文件,但这似乎不是一个好的解决方案:如果应用程序开发有自己的 messages.properties 文件,只会读取其中一个,导致消息值丢失。
似乎 Spring Boot MessageSourceAutoConfiguration 应该有一个 CompositeMessageSource 的概念,它遍历 Spring ApplicationContext 中可用的一个或多个 MessageSource 实例(和 Ordered), 由 DispatcherServlet 使用。这将允许任何初学者通过在其自动配置中声明 MessageSource 来为可用消息做出贡献
可以按照我的要求去做吗?对于应用开发者来说,最“不干涉”的解决方案是什么?
【问题讨论】:
-
只是想知道你所说的“com/foo/wherever/i18n.properties”是否是消息属性文件应该与 JSP 视图位于同一目录中(或与视图位于同一包中,如果使用 JSP 以外的其他东西)?这是struts2中处理消息资源的方式。
标签: java spring internationalization spring-boot