2011-03-21 73 views
8

這裏我們有一個使用JSP的基本webapp,它需要提供幾個基於JSON的REST服務URL。Spring MVC - 強制控制器生成MappingJacksonJsonView(s)

這些網址全部位於/services之下,由MyRestServicesController生成。

我看到的設置基於JSON的視圖的示例都使用ContentNegotiatingViewResolver。但是這對我來說似乎有點矯枉過正,因爲這種解析器似乎適用於相同URL可能產生不同輸出的情況。

我只是想讓我的一個RestServicesController始終產生MappingJacksonJsonView(s)

是否有一種更簡潔直接的方式來簡單地指示控制器執行此操作?

+0

你特別想要'MappingJacksonJsonView',還是隻想輸出JSON? – skaffman 2011-03-21 08:37:39

+0

JSON輸出是最終目標,使用標準彈簧組件似乎是最佳實踐。 Johan打在了頭上。 – 2011-03-21 09:37:52

回答

12

是否有一種更簡潔直接的方式來簡單地指示控制器執行此操作?

是的。你可以看看我發佈在Spring forums的這個樣本。總之,我喜歡這樣做的方式是通過以下方式。

的ApplicationContext:

<!-- json view, capable of converting any POJO to json format --> 
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 

控制器

@RequestMapping("/service") 
public ModelAndView getResultAsJson() { 
    Object jsonObj = // the java object which we want to convert to json 
    return new ModelAndView("jsonView", "result", jsonObj); 
} 

編輯2013:在這些現代化的日子裏,@ skaffman的做法將是一個不錯的選擇。

+0

噢,這是完全合理的,而且非常簡單。正是我所希望的,以及超快速的反應。萬分感謝。我一定已經閱讀了5次BeanName解析器,並且它從未被點擊過使用它,我認爲我的頭仍然陷在模板域中。 – 2011-03-21 09:36:45

9

如果您只需輸出JSON,則視圖圖層本身就是多餘的。您可以use the @ResponseBody annotation指示Spring使用Jackson直接序列化您的模型。它需要的配置比​​方法少,代碼也不那麼混亂。

+1

+1這對我有用。你知道我可以如何改變內容類型嗎? – stacker 2011-06-24 13:50:30

+2

@ResponseBody有一個缺點,在控制器返回後,立即呈現視圖,關閉HttpResponse,因此無法添加標頭(例如通過Interceptor的postHandle方法)。使用ContentNegotiatedViewResolver沒有這個問題。 – devdanke 2013-07-26 18:08:32