java之从 SpringMVC 中的 REST API 返回动态类型的最佳实践是什么
我用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)情况下做更多的事情,您应该改变策略。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。