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