我正在编写一个自定义的Spring Boot入门程序,其他开发人员将其放入他们的应用程序中,并且该入门程序包含开箱即用的控制器和UI屏幕。
这些UI屏幕已经国际化,并且i18n键/值在打包文件中:com/foo/wherever/i18n.properties。
com/foo/wherever/i18n.properties
我想确保在启动时加载启动程序时,这些i18n.properties会MessageSource自动在应用程序中可用,以便我的UI页面能够正常工作(通过普通的Spring Controller + ViewResolver + View实现呈现), 而无需应用程序开发人员指定此自己存档 。
MessageSource
换句话说,他们应该能够将我的启动器添加到其运行时类路径中,并且一切都“正常运行”而无需进行任何配置。
现在,我发现应用程序开发人员可以创建自己的src/main/resources/messages.properties文件 并在中 手动配置其他消息文件application.properties:
src/main/resources/messages.properties
application.properties
spring.messages.basename = messages, com.foo.wherever.i18n
这将起作用。
但是,这需要满足以下两个条件:
spring.messages.basename
messages.properties
我想我 可以 将我的i18n.properties文件移动到启动程序.jar中的classpath:/messages.properties文件中,但这似乎不是一个好的解决方案:如果应用程序开发人员拥有自己的messages.properties文件,则其中只有一个它们将被读取,从而导致缺少消息值。
看起来好像春天启动MessageSourceAutoConfiguration应该有一个概念CompositeMessageSource是在一个或多个迭代MessageSource实例可用(并且Order在Spring的ApplicationContext ED)和 该 所使用的DispatcherServlet的。这将使任何入门者只需MessageSource在其自动配置中声明一个即可为可用消息做出贡献
CompositeMessageSource
Order
我可以按照我的要求去做吗?对于应用程序开发人员来说,最“轻松”的解决方案是什么?
也许这是一个远景,但是您可以尝试使用BeanFactoryPostProcessor。
想法如下:
将“ messageSource” bean移出应用程序上下文。请注意,如果例如开发人员想要使用自己的实现并且不使用spring boot自动配置,则可能但不一定是spring boot的。
将其替换为您自己的尝试解析“您的键”的实现,其余的委托给原始消息源。反之亦然,如果您想让开发人员覆盖您的翻译(如果原始消息源没有为未知键抛出异常,则可能会出现问题)。
但是,也许有更好的方法可以做到这一点。