【问题标题】:@ResponseBody , ResponseEntity Spring return Object as JSON@ResponseBody , ResponseEntity Spring 以 JSON 形式返回对象
【发布时间】:2018-01-11 11:27:59
【问题描述】:

我使用的是 Spring 版本 4(spring 数据),我想将 Object 作为 JSON 返回,我想知道即使没有使用 xmlRootElement 注释用户类,以下代码也能正常工作:

@RequestMapping(value = "/resources/users", method = RequestMethod.GET)
public ResponseEntity<User> getUserByLogonId(OAuth2Authentication auth) {

    String userLogonId = ((org.springframework.security.core.userdetails.User) auth.getUserAuthentication()
            .getPrincipal()).getUsername();
    UsersServices usersServices = new UsersServicesImpl(usersOperations);
    User user = usersServices.findByLogonId(userLogonId);
    HttpStatus userStatus = HttpStatus.NOT_FOUND;
    if (user != null) {
        userStatus = HttpStatus.FOUND;
    }
    return new ResponseEntity<User>(user, userStatus);
}

任何机构都可以解释一下吗? ResponseBody/ResponseEntity 是自己做的吗?当我需要注释要作为 JSON 返回的对象类时。

【问题讨论】:

  • 你在使用 Spring Boot 吗?
  • 我正在使用弹簧数据
  • 你在使用@RestController 吗?
  • 是的,没错,restcontroller 默认包含 responsebody 对吧?

标签: java spring spring-mvc spring-data


【解决方案1】:

Spring boot 使用 jackson json 库来编组和解组 java 对象到/从 json 对象 不需要任何显式配置。

【讨论】:

    【解决方案2】:

    @RestController 本身添加了@ResponseBody 注释。你可以在Github Issue看到它

    您也可以查看official spring tutorials。在这里您可以检查以下行和示例:

    这些控制器方法返回简单的 POJO - Collection&lt;Bookmark&gt;, 和Bookmark 等,除了add 的情况。当一个 HTTP 请求 进来指定一个Accept headerSpring MVC 循环通过 配置HttpMessageConverter,直到找到可以转换的 从POJO 域模型类型到指定的内容类型 Accept header,如果这样配置的话。

    您也可以按照Official doc中的以下行和示例进行操作

    @RestController 是一个结合了@ResponseBody 的原型注解 和@Controller。不仅如此,它还赋予你更多的意义 控制器,也可能在未来的版本中携带额外的语义 框架。

    还有,

    与@RequestBody 和@ResponseBody 一样,Spring 使用 HttpMessageConverter 在请求和响应之间进行转换 流。

    【讨论】:

    • 我明白这一点,但我的问题是为什么不需要 xmlrootelement
    • 是的,您在给定的链接上有答案。如果您使用@ResponseBody 注释函数或使用@RestController 返回ResponseEntity&lt;&gt;,则返回的对象将自动转换为JSON。
    • @MohammadKarmi,我已经编辑了我的答案。您可以查看此
    【解决方案3】:

    xmlRootElement 用于将对象表示为 XML 文档中的 XML 元素。 XML 与 JSON 无关。
    当你用@RestController 注释你的类时,它结合了@Controller 用于类和@ResponseBody 用于每个方法。然后HttpMessageConverter 在请求和响应流之间进行转换。
    @ResponseEntity 用于使用自定义参数(标头、http 代码等)形成 http 响应。例如:

    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
    

    【讨论】:

      猜你喜欢
      • 2014-12-06
      • 2016-02-03
      • 1970-01-01
      • 2012-09-26
      • 2013-06-15
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2013-05-23
      相关资源
      最近更新 更多