spring本地化消息持久性

Jak*_*kub 4 spring persistence internationalization

我会问是否知道一些"标准"方式如何保留消息,这些消息将在以后进行本地化.请注意,这还包括消息参数.例如,我在资源包中有代码"msg1"和1个参数的消息:

msg1 = Hello {0}
Run Code Online (Sandbox Code Playgroud)

我想将消息与一个对象关联起来,坚持下去.以后,不同的客户端会询问具有不同语言设置的对象.

obj.setDisplayMsg(msgSource.getMessage("msg1", "World", locale))
Run Code Online (Sandbox Code Playgroud)

我能想象:

  1. 将消息存储为具有消息代码和参数的顶级对象.我害怕性能 - 在单独的varchar列中,如果没有转换的简单错误消息,在单独的表中使用单独的对象似乎要差得多.
  2. 在字符串表示中编码消息代码及其参数,并使用一些hibernate自定义类型映射
  3. 但是,它是不是已经解决了(最好在春天),所以我不必再这样做了?

谢谢

更新:目前,我们做了一些中途 - 我们将消息作为序列化消息对象存储在映射表中的单列中.我仍然完全满意 - 直接在数据库中查看数据是不可能的.

sin*_*pop 5

我不认为你的是一个非常普遍的需求,因此可能没有什么可用的.很确定Spring没有开箱即用.因此,选项3被丢弃.

1和2之间的决定主要是商业决策.想象一下,消息格式在持久化后会发生变化(例如由于某些错误).你现在想得到什么?可能是修正过的,只能通过选项1获得.

另一方面,如果您想将其保存为应用程序对用户的内容的证明,则可以使用1和2(但在第一种情况下,您需要保存消息格式而不是其代码) .

在我看来,第一个选择是最好的.你不会那么担心它的性能,因为它可能不是你应用程序的瓶颈.也许消息和参数之间的多对多(而不是一对多)关系可以很好并且可以节省一些内存,但这不是主要目的.在参数表中,您可以存储一些额外的信息,例如参数的类型.这样,您可以轻松搜索,例如,msg1类型的所有消息或打印用户Jakub的消息(因为您存储了该用户类型的参数).

最后,永远不要在数据库中保存序列化对象.它们依赖于语言,您无法搜索它们,可能会出现版本问题......最重要的是,至少在这种情况下,您不需要它,因为最后所有参数都必须转换为字符串.