小编典典

自定义Spring Boot启动器:如何将i18n消息贡献给MessageSource?

spring-boot

我正在编写一个自定义的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

这将起作用。

但是,这需要满足以下两个条件:

  1. 他们必须手动配置spring.messages.basename属性-这不是自动的。和
  2. 他们必须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在其自动配置中声明一个即可为可用消息做出贡献

我可以按照我的要求去做吗?对于应用程序开发人员来说,最“轻松”的解决方案是什么?


阅读 798

收藏
2020-05-30

共1个答案

小编典典

也许这是一个远景,但是您可以尝试使用BeanFactoryPostProcessor

想法如下:

  1. 将“ messageSource” bean移出应用程序上下文。请注意,如果例如开发人员想要使用自己的实现并且不使用spring boot自动配置,则可能但不一定是spring boot的。

  2. 将其替换为您自己的尝试解析“您的键”的实现,其余的委托给原始消息源。反之亦然,如果您想让开发人员覆盖您的翻译(如果原始消息源没有为未知键抛出异常,则可能会出现问题)。

但是,也许有更好的方法可以做到这一点。

2020-05-30