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

时间:2013-06-10 18:22:16

标签: spring-mvc jackson content-negotiation

我正在使用带注释的控制器和内容协商(@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应该用于哪种情况?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

want the JSON representation of the {{Foo}} to be different for those methods

嗯,你肯定需要不同的序列化器和foos。没有远离这个事实。它最好是imho。