2017-05-04 28 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

相关问题