0

在 JSF 页面中,我必须显示来自实体的数据。该实体有一些 int 字段,不能直接显示,需要翻译成描述性字符串。在它们之间,一些可以有有限数量的值,另一些有很多可能的值(例如 wordlwide Country_ID),并且值得在 Db 上使用关联(ID、描述)表。

后一种情况可以很容易地通过从原始实体到与字典表(ID,描述)对应的实体的关系导航来解决,但我不想引入新实体只是为了解决从 ID 到描述的翻译。

另外还有一个整数字段有特殊需求:十万个数要按照100015 -> A00015, 301023 -> C01023等规则换成字母。

最初我将翻译代码放在实体本身中,但我知道这个解决方案的巨大局限性和缺点。

然后,我创建了一个单音 ( EntityTranslator ),其中包含翻译不同字段的所有方法。对于字段值很多的情况,我将它们放在从单调加载并在TreeMap中转换的表中,否则描述在类内的数组中。

ManagedBean 中,我为EntityTranslator编写了一个 getter,在 jsf 中我使用了很长的 el 语句,如下所示:

#{myManagedBean.entityTranslator.translateCountryID(myManagedBean.selectedEntity.countryID)}

我认为这个问题很普遍,我正在寻找一种标准的方法来解决它,但是,如前所述,我不想创建新的“愚蠢”实体只是为了将 ID 与描述相关联,我认为它是矫枉过正。

另一种可能性是使用转换器 Object(Integer) <-> String 但我更愿意在同一个类中拥有实体的所有翻译需求。

4

1 回答 1

0

您的问题归结为以下简单的一行:

如何在视图中显示与实体 id 不同的字段,以及如何将整数字段变形为更有意义的内容。

答案是视情况而定。

如果您只想输入/输出数据,则除了可能的视图参数(如?id=12345. 在这种情况下,您可以在视图中输入/输出任何您想要的内容:id 始终存在。

如果您想创建一个新实体,很可能您有一种通过 JPA 或数据库生成 id 的方法,或者除了用户的直接输入之外的其他方法。在这种情况下,您也不需要弄乱 id。

如果您想使用其他实体的信息,例如向用户显示带有国家列表的下拉框,您始终可以选择分开label(让它成为名称)和value(让它成为 id),甚至有一个唯一的不为空包含数据库表中将用作自然标识符的国家名称的列。如果您想使用输入文本字段从用户那里获取数据,您总是可以创建一个转换器来完成将用户输入字符串转换为实际实体对象的工作。

关于整数的转换,您实际上有几个选择:第一个是为这些字段附加一个转换器,将大致进行301023 -> C01023转换C01023 -> 301023,第二个是编写自定义 EL 函数,第三个是准备事先选择正确的模型/即时进行转换。

于 2013-10-03T07:19:49.603 回答