Java POJO中模式自由模型的最佳实践是什么?

3
我正在使用Java POJO处理模型,使用类似于ElasticSearch的无模式数据库,通过使用Jackson将它们序列化为JSON。模型中的几个字段是“固定的”,在数据库中的每个对象中共享。
然而,在每个无模式架构中,有一些对象可能具有不同的字段。如何处理这种模型是最佳实践?
目前,我在模型本身中使用简单的多维HashMap(s),但这很棘手,也许不是最好的解决方案(特别是,无法处理多级字段)。在这种情况下是否有最佳实践呢?

我不确定这是否是最佳实践,但我们通过提供访问器方法来处理常见的、始终可用的属性(getCommonProperty())。可选属性可以通过简单的 getProperty(String) 方法访问,或者如果某些对象/类经常使用,我们会对我们的公共类进行子类化并添加类型访问器。因此,总体而言,您的方法似乎是一个合理的选择。 - Dominik Sandjaja
问题在于我们的软件非常庞大,我们提供了几个扩展和用户编写的插件,使用Jython/Groovy等语言可以访问同一模型,但可能需要向其编写自定义字段。通过使用子类,这些字段无论如何都被“固定”到一组可能的子类中。 - Carmine Giangregorio
1
我同意,只有在您在多个地方重复使用相同的模型(至少部分)时,子类才是一个好主意。但是,正如您所提到的,除了通用的getProperty(String key)之外,我不知道处理动态模型的最优雅的方法。尽管如此,我会关注这个问题和讨论,也许其他人会提出更好的想法 :-) - Dominik Sandjaja
1个回答

0

一种可能性是使用多态类型,其中基类可以定义公共属性集,子类可以定义额外的属性。根据您的需求,您可能还需要启用多态处理;也就是说,根据上下文是否知道预期类型(不需要类型信息),或者如果不知道(即存储在JSON文档中),则需要多态处理。

然而:一种更简单和更动态(但不太类型安全)的方法可能是使用“dyna-beans”方法,例如在此处解释:

http://www.cowtowncoder.com/blog/archives/2011/07/entry_458.html

这样你就可以定义一组命名的、完全类型化的核心属性;其余的属性可以根据需要包含。这些额外属性的类型将需要是“自然”类型(字符串、数字、布尔值、映射、列表),但你可以使用Jackson来进一步在这些类型和POJO之间进行转换(使用ObjectMapper.convertValue())。

或者,如果你愿意,动态属性也可以被指定为JsonNode,这样你就可以得到漂亮的可遍历JSON树访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接