自定义Spring Boot入门程序:如何将i18n消息贡献给MessageSource?
问题内容:
我正在编写一个自定义的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文件移动到启动程序.jar中的classpath:/messages.properties文件中,但这似乎不是一个好的解决方案:如果应用程序开发人员拥有自己的messages.properties文件,则其中只有一个它们将被读取,从而导致缺少消息值。
看起来好像春天启动MessageSourceAutoConfiguration应该有一个概念CompositeMessageSource
是在一个或多个迭代MessageSource
实例可用(并且Order
在Spring的ApplicationContext
ED)和 该
所使用的DispatcherServlet的。这将使任何入门者只需MessageSource
在其自动配置中声明一个即可为可用消息做出贡献
我可以按照我的要求去做吗?对于应用程序开发人员来说,最“轻松”的解决方案是什么?
问题答案:
也许这是一个远景,但是您可以尝试使用BeanFactoryPostProcessor。
想法如下:
-
从应用程序上下文中取出“ messageSource” bean。请注意,如果例如开发人员想要使用自己的实现并且不使用spring boot自动配置,则可能但不一定是spring boot的。
-
将其替换为您自己的尝试解析“您的键”的实现,其余的委托给原始消息源。反之亦然,如果您想让开发人员覆盖您的翻译(如果原始消息源没有为未知键抛出异常,则可能会出现问题)。
但是,也许有更好的方法可以做到这一点。