2017-05-04 67 views
3

我正在用Spring MVC編寫一個Web應用程序。我可以在同一個URI上配置HTML和Spring數據REST JSON嗎?

遵循REST原則,我想在我的應用程序中使用一致的URI來獲取相同的資源,並使用內容協商來選擇是否返回HTML或JSON。在瀏覽器中訪問/people/bob應該顯示他的個人資料頁面,使用curl獲取它應該給我一個JSON表示。

但是,because of a semantic limitation (bug?) in the RequestMappingHandlerMapping,如果我在匹配的URI上定義任何顯式控制器(如HTML控制器),我不能「通過」通用Spring Data REST映射。除了爲每個匹配的HTML控制器手動實現@RestRepositoryController之外,是否還有其他簡單的方法可以讓Spring MVC內容在HTML和JSON映射之間進行協商?


實例映射不起作用:

@BasePathAwareController 
class PersonHtmlController { 
    @GetMapping(path = '/people/{id}', produces = 'text/html') 
    ModelAndView person(@PathVariable Person id) { 
     new ModelAndView('person', [person: id]) 
    } 
} 

這將產生預期的HTML輸出,但返回一個406,當我問JSON不能接受的。

+1

你試過覆蓋'$ WebMvcConfigurerAdapter configureContentNegotiation',如建議[這裏](http://stackoverflow.com/a/33010537/5873923)? (另一個例子可以[在這裏](http://www.baeldung.com/spring-mvc-content-negotiation-json-xml))。 –

+0

@MarcTarin這些都可以通過Boot自動配置。 – chrylis

回答

0

你可以去contentnegotiatingviewresolver。以下是一個例子。

@RequestMapping(value = "/users", method = RequestMethod.GET) 
public ModelAndView userDetails() { 

    ModelAndView modelAndView = new ModelAndView(); 
    List userDetails = userService.getUserDetails(); 
    modelAndView.addObject("users", userDetails); 
    modelAndView.setViewName("userDetails"); 
    return modelAndView; 

} 

所以每當一個請求帶有/users那麼HTML頁面將供應和當請求當屬/users.json那麼JSON響應將產生。

通過擴展Sp​​ring提供的WebMvcConfigurerAdapter,可以通過覆蓋以下方法來配置它。

@Override 
public void configureViewResolvers(ViewResolverRegistry registry) { 

    registry.jsp("/WEB-INF/jsp/", ".jsp").viewClass(JstlView.class); 
    registry.enableContentNegotiation(
      new MappingJackson2JsonView() 
    ); 

} 

希望這會有所幫助。 參考: contentnegotiating view resolver example

+0

這與我所問的問題無關,這是映射階段,而不是視圖分辨率。 – chrylis

相關問題