对于使用未定义生成的 JSON 的 Spring boot @RequestMapping 应该返回啥?

Posted

技术标签:

【中文标题】对于使用未定义生成的 JSON 的 Spring boot @RequestMapping 应该返回啥?【英文标题】:What should return be for Spring boot @RequestMapping that consumes JSON with produces not defined?对于使用未定义生成的 JSON 的 Spring boot @RequestMapping 应该返回什么? 【发布时间】:2019-03-21 08:41:20 【问题描述】:

我看到了一个问题,我希望进行健全性检查...我在 UI 端处理从 Spring Boot 控制器方法返回的问题。该方法返回一个字符串,它的@RequestMapping 将“consumes”定义为 JSON。没有定义“产品”。

在 UI 端,我看到一个错误,因为在响应标头中 Content-Type 被列为 application/json,但它实际上是一个字符串,因此当它尝试解析 JSON 时它会失败。

Spring 是否假设生产类型为 JSON,因为消费者设置为 JSON 而生产未设置?无论方法的返回类型是什么,生产是否默认为消费设置的任何值?

这里是有问题的方法,去掉了任何识别细节:

@ApiOperation(value = "Do the thing", notes = "The API does the thing", response = String.class)
@RequestMapping(value = "/do/the/thing", method = RequestMethod.POST, consumes = "application/json")
public String doTheThing(
        @ApiParam(value = "HttpHeaders parameter containing user authorization token.")
            @RequestHeader(value = AUTHORIZATION_HEADER_NAME) String authorization,
        @ApiParam(value = "Object ID of the existing thing.")
            @PathVariable String thingId,
        @ApiParam(value = "A map of properties for the thing to be created. This typically includes mandatory fields such as thing name and type.")
            @RequestBody Map<String, Object> plan,@RequestParam(value = "tagName", required = false) String tagName) 
    <Code to do the thing, and return a string>
    return response;

然后,在 UI 开发人员窗口中,如果我查看该方法的响应标头,则表明 JSON 的内容类型:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://127.0.0.1:9000
Access-Control-Expose-Headers: Access-Control-Allow-Origin,Access-Control- 
Allow-Credentials,Access-Control-Allow-Methods
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: application/json;charset=UTF-8
Date: Tue, 16 Oct 2018 18:11:22 GMT
Expires: 0
Pragma: no-cache
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
X-Application-Context: bootstrap
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

【问题讨论】:

包含几行代码将有助于理解问题然后阅读整个段落。 @want2learn 这很公平,我添加了该方法的通用版本,以便您查看。所有注释等都与实际方法相同。 【参考方案1】:

根据您的问题描述,您需要的是返回 json。 如果您将返回字符串“我是一个测试”作为 json 将是相同的。当您的应用程序是 spring-mvc 应用程序时,问题就出现了。 在这种情况下,它会尝试将其解析为视图而不是纯文本。

解决方案:

    将您的控制器注释为@RestController

    将@ResponseBody 添加到您的方法中

为了回答您最初的问题,spring 将尝试根据您包含的依赖项确定要返回的类型。如果它依赖于 spring-web,它将尝试解析视图。 如果你有一个@RestController,它会根据jackson依赖来计算出来。

如果我不明白你真正的问题,请澄清它并添加依赖项。

【讨论】:

@RestController 是一个方便的注解,只不过是添加了@Controller@ResponseBody 不,你明白......我部分是在寻找我所看到的预期的健全性检查。不幸的是,我无法更改当前的后端控制器。我想知道是否有办法在 UI 端绕过它。我尝试在 REST 请求中添加一个“text”的 responseType 来强制它,但在控制台中它仍然显示为“application/json”,并且 angular 仍然尝试将其解析为 JSON。 @monkeyWithAMachinegun 您可以尝试使用 Postman 应用程序并通过回复更新您的问题吗?查看响应是否是实际的 json 或其他内容。 响应绝对是 JSON,因为我可以在返回的标头中看到它...此外,当我尝试在 POST 标头中添加 Accept: 'text' 时,我得到了 406 Not Acceptable从服务器返回,所以我认为它打算只发送 JSON。基本上他们在角度 1.2.x 中侥幸逃脱,但是当我尝试转到 1.3.x 时,它更加严格。我认为我们需要从根本上解决这个问题。

以上是关于对于使用未定义生成的 JSON 的 Spring boot @RequestMapping 应该返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Waypoints 错误“未定义通知”

处理未定义声明文件 (index.d.ts) 的正确方法

Spring中Bean名的自定义生成策略

是否有为 Spring 3 REST 控制器生成 JSON SMD 的解决方案?

URLDownloadToFile 生成编译错误:未定义子或函数

在 BigQuery 中读取时,未定义行 XXXX、列 xx-xx 处的 JSON 输入意外结束