我正在使用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。
答案 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响应。
您可以通过扩展Spring提供的WebMvcConfigurerAdapter来覆盖以下方法,从而以下列方式对其进行配置。
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/jsp/", ".jsp").viewClass(JstlView.class);
registry.enableContentNegotiation(
new MappingJackson2JsonView()
);
}
希望这会有所帮助。 参考: contentnegotiatingviewresolver