【问题标题】:Spring MVC: Applying different JSON serializer for different annotated controller methodSpring MVC:为不同的带注释的控制器方法应用不同的 JSON 序列化器
【发布时间】:2013-06-10 18:22:16
【问题描述】:

我正在使用带注释的控制器和内容协商 (@ResponceBody) 创建一个 REST 服务。我有两个不同的控制器方法返回 {{Foo}} 的实例,它们服务于不同的用例,我希望 {{Foo}} 的 JSON 表示对于这些方法是不同的。

例如:

@ResponseBody
public Foo method1() {... return new Foo(123); } // should produce '123'
@ResponseBody
public Foo method2() {... return new Foo(123); } // should produce '{name:"Foo", number:123}'

当然,我可以使用 DTO 模式并以不同的方法返回不同的 DTO(例如分别为 {{FooDTO1}} 和 {{FooDTO2}}),然后为这些 DTO 注册不同的 JSON 序列化程序。但我想知道是否有更好的方法,对我来说,定义两个额外的 DTO 类并创建这些类的一次性实例只是为了应用正确的 JSON 序列化程序,这感觉是错误的。 我不能以某种方式暗示 Spring 或 Jackson 在哪种情况下应该使用哪个 Serializer?

【问题讨论】:

  • 您可以返回一个字符串并使用首选的 JSON 实用程序手动对其进行序列化。
  • should produce '123' - 输出 123 不是 JSON。如果您希望它是 String 123,则将返回类型更改为 String 并实现 toString() 以仅返回 123 值可能会起作用
  • @CodeChimp,控制器方法必须返回对象才能进行内容协商。 JSON 在这里只是一个例子。也可能有一对说 XML 表示,我也需要以某种方式区分它们。我正在寻找的是一种将 Spring 的 http 消息转换器与特定控制器方法或一组方法或用一些元数据注释的方法等相关联的方法。
  • 您可以使用 HttpServletResponse 来设置内容类型。人们总是这样做。由于您正在请求一种返回 JSON 的非标准方式(使用两个序列化框架),因此您需要一种稍微不那么标准的方法。如果您只是返回一个对象,Spring 将使用 Jackson(如果可用)。如果您想使用其他框架来编组它,那么您将必须设置内容类型并返回一个表示编组对象的字符串。我还建议您淡化您对@andyb 的回复。你可以用蜂蜜捕捉更多的苍蝇。
  • 您也许可以使用@JsonViews 执行此操作 - 请参阅stackoverflow.com/questions/5772304/…,感谢@CodeChimp 的支持:)

标签: spring-mvc jackson content-negotiation


【解决方案1】:

正如@CodeChimp 所建议的,不同的请求内容类型可用于在同一资源的不同表示之间切换。它与 REST 理念相对应,并由 Spring 直接支持,因为它依赖于内容类型来选择序列化程序。 所以,我需要做的就是为Foo 类注册两个序列化程序,每个都绑定到不同的内容类型。 例如。 application/json-vnd.myCompany.com+type1 表示将由 Serializer1application/json-vnd.myCompany.com+type2 相应地由 Serializer2 生成。然后由客户决定选择哪种表示。

【讨论】:

  • 谢谢,很高兴您提供了一种 REST 惯用的方法来解决这个问题。
【解决方案2】:
want the JSON representation of the {{Foo}} to be different for those methods

您肯定需要不同的序列化程序和 foo。无法逃避事实。以及它更可取的恕我直言。

【讨论】:

  • 当然,我有那些序列化程序。问题是如何让 Spring(或 Jackson)使用 Serializer1 作为 method1() 的输出,使用 Serializer2 作为 method2() 的输出,即使这两种方法的输出类型相同?
  • @wajda 好的,你需要两个不同的 foo,这也是我应该说的。
猜你喜欢
  • 1970-01-01
  • 2017-09-24
  • 2011-12-24
  • 1970-01-01
  • 2010-12-30
  • 2012-06-16
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多