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

标签 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 上定义任何显式 Controller (例如 HTML Controller ),我就无法“落入”通用 Spring Data REST 映射。除了为每个匹配的 HTML Controller 手动实现 @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 输出,但当我请求 JSON 时返回 406 Not Acceptable。

最佳答案

你可以去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 响应。

您可以通过扩展 Spring 提供的 WebMvcConfigurerAdapter 来重写以下方法,以如下方式进行配置。

@Override
public void configureViewResolvers(ViewResolverRegistry registry) {

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

}

希望这有帮助。 引用: contentnegotiating view resolver example

关于java - 我可以在同一个 URI 上配置 HTML 和 Spring Data REST JSON 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43772444/

相关文章:

java - 为什么我从 Spring 存储库中收到 NonUniqueResultException?

java - 使用 CrudRepository 从 View 获取数据

java - Neo4j 核心 : Load RelationShips with order

java - android studio 使用JNI 构建c/c++,但c/c++ 需要另一个lib.a,如何解决

java - 在 Spring 中使用 MultiPartFile 数据类型在 webapp 上上传时重命名文件

java - 监控bean注入(inject)失败

java - 如何在 Android 中将数字从指数形式转换为正常形式?

java.lang.IllegalArgumentException : Contents must be presorted

java - Spring Autowiring 对象在postcontruct方法中为空

spring - ehcache在生产环境中失败