java之从 SpringMVC 中的 REST API 返回动态类型的最佳实践是什么

yjmyzz 阅读:28 2023-09-06 19:40:43 评论:0

我用springMVC+Jackson+hibernate实现了一些REST API。 我需要做的就是从数据库中检索对象,将其作为列表返回,到 JSON 的转换是隐式的。

但是有一个问题。如果我想在返回/响应之前向这些对象添加更多信息。例如,我正在返回一个“商店”对象列表,但我想添加一个正在参加的人的名字。 JAVA没有动态类型(我是如何在C#中解决这个问题的)。那么,我们如何在JAVA中解决这个问题呢?

我考虑过这个问题,并提出了一些不太优雅的解决方案。 1. 使用工厂模式,定义另一个包含那个人的名字的类。 2.隐蔽存储对象到JSON对象(来自jackson的ObjectNode),将新属性放入json对象,返回json对象。 3.使用反射注入(inject)一个新的属性来存储对象,返回对象,也许SpringMVC转换会正确生成JSON?

选项 1 看起来很糟糕,最终会产生很多实际上没有用的样板类。选项 2 看起来不错,但这是我们用 springMVC 能做的最好的事情吗?

请您参考如下方法:

选项 1 实际上,您的 JSON 域与您的核心域不同。我会解耦它们并为您的 JSON 对象创建一个单独的域,因为这是一个单独的问题,您不想混合它。然而,这可能需要大量的一对一映射。这是您的选项 1,带有样板。有一些框架可以帮助您处理样板文件(例如 dozer、MapStruct),但是使用通用反射的框架总是会降低性能。

选项 2、3 如果你真的坚持要破解它,因为它只是少数异常(exception)而不是常见模式,我当然不会改变 JSON 节点或使用反射(你的选项 2 和 3)。这当然不是在 Java 中执行此操作的方法。

选项 4 [hack] 您可以做的是使用包含额外信息的新类型扩展您的核心域,并在后处理步骤中用新域对象替换旧对象:

 UnaryOperator<String> toJsonStores = domainStore -> toJsonStore(domainStore); 
 list.replaceAll(toJsonStores); 

其中 JSONStore 扩展域 Store 并且 toJsonStore 将域 Store 映射到 JSONStore 通过添加人名来对象。

这样您就可以保持类型安全并保持代码库的完整性。但是,如果您必须在少数异常(exception)情况下做更多的事情,您应该改变策略。


标签:springMVC
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号