我可以在同一个URI上配置HTML和Spring Data REST JSON吗?

时间:2017-05-04 01:32:41

标签: java spring spring-mvc spring-data spring-data-rest

我正在使用Spring MVC编写Web应用程序。

遵循REST原则,我希望在我的应用程序中使用一致的URI来获取相同的资源,并使用内容协商来选择是返回HTML还是JSON。在浏览器中访问/people/bob应该显示他的个人资料页面,并且使用curl获取它应该会给我一个JSON表示。

然而,because of a semantic limitation (bug?) in the RequestMappingHandlerMapping,我无法通过"如果我在匹配的URI上定义任何显式控制器(如HTML控制器),则为通用的Spring Data REST映射。除了为每个匹配的HTML控制器手动实现@RestRepositoryController之外,还有其他简单的方法可以在HTML和JSON映射之间进行Spring MVC内容协商吗?

不起作用的示例映射:

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

这会产生预期的HTML输出,但在我要求JSON时返回406 Not Acceptable。

1 个答案:

答案 0 :(得分:0)

你可以去Case。以下是一个例子。

@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()
    );

}

希望这会有所帮助。 参考: contentnegotiatingviewresolver