Spring MVC:为不同的带注释的控制器方法应用不同的 JSON 序列化器

Ale*_*yda 5 spring-mvc content-negotiation jackson

我正在使用带注释的控制器和内容协商(@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}'
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*yda 1

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