当前位置: 首页 > 知识库问答 >
问题:

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

公孙和怡
2023-03-14

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

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

但是,由于语义限制(bug?)在RequestMappingHandlerMapping中,如果我在匹配的URI上定义了任何显式控制器,例如HTML控制器,我就无法“跳转”到通用的Spring数据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输出,但在请求JSON时返回406,这是不可接受的。

共有1个答案

东方海
2023-03-14

你可以选择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;

}

因此,每当请求带有/user时,将提供html页面,当请求带有/users.json时,将生成JSON响应。

您可以通过扩展Spring提供的WebMVCConfigureAdapter来覆盖以下方法,以如下方式配置它。

@Override
public void configureViewResolvers(ViewResolverRegistry registry) {

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

}

希望这有帮助。参考:contentnegotiating视图解析器示例

 类似资料:
  • 当我尝试将同一个POJO用于Spring Data JPA与Spring Data GemFire的集成时,存储库总是使用POJO访问数据库。但我希望存储库能够访问来自GemFire的数据,尽管我添加了注释和。 我想这是因为我在同一个POJO类中添加了和。 请帮助修复,让我知道,如果我可以这样做吗?我需要把它分成2个POJO类为数据库和GENFire工作吗? 谢谢

  • 问题内容: 我可以在同一输出流上同时使用PrintWriter和BufferedOutputStream吗? 情况是这样的: 我有一个SSLSocket程序,我希望能够在不同的时间点轻松地在套接字上同时传输字符串和字节[],而不必将byte []转换为字符串等,但是,PrintWriter仅允许我传输字符串和BufferedOutputStream只允许我传输字节。 问题答案: PrintWrit

  • 问题内容: 我有2个maven2配置文件,硒和jspc。现在,对于“ selenium”,id希望隐式激活“ jspc”,这样我就不必从命令行编写mvn -Pselenium,jspc。这可能吗 ? 问题答案: 您不能“链接”配置文件激活(maven参考),但是可以通过相同的属性来激活它们: 和运行

  • 我的项目正在从自定义json格式转向json-hal和spring-data-rest。为了继续支持“旧”json,我想运行现有的资源控制器,并行于新的Spring-Data-Rest提供。 每当我配置spring-data-rest使用与现有控制器相同的url时,只使用旧的控制器,如果accept-header不匹配,我会得到一个错误响应。当我使用不同的网址时,一切正常 是否可以与spring

  • 我正在开发一个数据访问库,并希望能够以最少的配置将其作为依赖项包含在其他项目中(理想情况下只是自动连接存储库)。特别是,这个库使用自动配置类(在中启用)进行设置,并且需要禁用其他自动配置类才能工作(和)。 是否可以在从属项目之外执行此操作? 为了使配置尽可能简单,我希望避免将排除项放在依赖项目的注释或其属性中。 更新: 在我的@Configuration上,我尝试添加注释: 这导致了 Illega

  • 可以用JAVA创建一个对象,然后立即在同一行上使用setter吗? 如下所示:。设置某物(“字符串”); 我如何才能正确地执行此操作,eclipse总是说: 类型不匹配:无法从空转换到类类型