2013-06-10 2 views
0

Я создаю службу REST с помощью аннотированных контроллеров и согласования содержимого (@ResponceBody). У меня есть два разных метода контроллера, возвращающих экземпляр {{Foo}}, который обслуживает разные варианты использования, и я хочу, чтобы JSON-представление {{Foo}} отличалось для этих методов.Spring MVC: Применение различных сериализаторов 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 образец и возвращать различные DTOs в различных методов (например, {{FooDTO1}} и {{FooDTO2}} соответственно), а просто зарегистрировать различные сериализаторы JSON для эти DTO. Но мне интересно, есть ли лучший способ, поскольку мне просто нехорошо определять два дополнительных класса DTO и создавать одноразовые экземпляры этих классов только для того, чтобы применять правильные сериализаторы JSON. Не могу ли я как-то намекнуть на весну или Джексон, какой Serializer следует использовать для какого случая?

+0

Вы можете вернуть строку и сериализовать ее вручную, используя предпочтительную утилиту JSON. – CodeChimp

+0

'должен производить '123'' - выход' 123' не является JSON. Если вы хотите, чтобы это было _String_ '123', то изменение типа возврата в String и реализация toString(), чтобы просто вернуть значение« 123 », могло бы работать – andyb

+0

@CodeChimp, метод контроллера должен возвращать объект, чтобы разрешить содержимое Переговоры. JSON - это просто пример. Могут быть также пара, например, XML-представлений, между которыми мне также нужно будет различать. То, что я ищу, это способ связать конвертер http-сообщений Spring с конкретным методом контроллера или набором методов или методом, аннотированным с некоторыми метаданными и т. Д. – wajda

ответ

1

Как было предложено @CodeChimp, различные типы содержимого запроса могут использоваться для переключения между различными представлениями одного и того же ресурса. Он соответствует философии REST и напрямую поддерживается Spring, поскольку он использует тип контента для выбора сериализатора. Итак, все, что мне нужно сделать, это зарегистрировать два сериализатора для класса Foo, каждый из которых связан с другим типом контента. . application/json-vnd.myCompany.com+type1 будет производиться по Serializer1 и application/json-vnd.myCompany.com+type2 по Serializer2 соответственно. Это будет до клиента, то какое представительство выбрать.

+0

Спасибо, я рад, что вы предоставили REST-Idiomatic способ приблизиться к этому. – coderatchet

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

Ну, вам обязательно понадобятся разные сериализаторы и foos. От этого не обойтись. И его предпочтительное имхо.

+0

Уверен, у меня есть эти сериализаторы. Вопрос заключается в том, как заставить Spring (или Jackson) использовать Serializer1 для вывода методов1() и Serializer2 для вывода метода2(), даже если для обоих методов один и тот же тип? – wajda

+0

@wajda ok вам понадобятся два разных фью, это то, что я должен был сказать. – NimChimpsky