gpt4 book ai didi

java - 在 Spring Boot 2 中将包含带引号的字符串的请求正文解析为 JSON

转载 作者:行者123 更新时间:2023-12-04 03:46:59 28 4
gpt4 key购买 nike

我有一个应用程序,它公开一个端点,接受 PUT 请求作为 JSON 格式的字符串,例如:

PUT /my/endpoint
"some string"
我的端点方法签名类似于:
@RequestMapping(
path = "/my/endpoint",
consumes = "application/vnd.mycompany.myservice-v1.hal+json"
)
public ResponseEntity<MyResponse> myEndpoint(
@RequestBody final String myString
) {
...
}
使用 Spring Boot 1 (1.5.22.RELEASE),上面给出的 myString 示例的 PUT 的值将是文字文本 some string ,但在 Spring Boot 2 (2.3.6.RELEASE) 下,它现在是文字文本 "some string" - 即它似乎输入没有被严格解析为 JSON,因为引号没有被删除。
我相信带引号的字符串是有效的 JSON(而未带引号的字符串不是),就像对象(在 {} 中)和列表(在 [] 中)一样。
我已经删除了一些我认为对手头问题无关紧要的无关细节(例如,我们使用 CompletableFuture 作为返回值,我在那里也有一个 @PathVariable 并且有一些注释驱动的验证正在进行上),但我已经离开了,我们正在使用自定义媒体类型,以防与它有关。
有什么想法可以说服 Spring Boot 2 将我的请求正文正确地视为 JSON 吗?不幸的是,我无法重新定义 API,因为我们已经有现场客户在使用它。

最佳答案

这可能不是最好的选择,但如果在开始时没有其他帮助。而不是 String 让 Spring 将 RequestBody 作为 Object 处理。所以像:

public ResponseEntity<String> myEndpoint(@RequestBody final Object myString)
当使用 String 时,Spring 甚至可能不使用 Jackson 进行解析,而是将主体作为 String 处理,即使内容类型设置为 JSON,它也应该包含主体中的所有字符。
如果您执行以下操作:
String myString2 = new ObjectMapper().readValue(myString, String.class);
你可以看到它导致 myString2 没有那些周围的双引号。
对于 Object Spring 似乎以不同的方式处理它。它使其成为 String 但似乎将其视为 JSON 值(并且作为 String 值,因为有双引号)它不应该有双引号。
如果你使用 Object 然后记录 myString.getClass() 你会看到它实际上是一个 java.lang.String

关于java - 在 Spring Boot 2 中将包含带引号的字符串的请求正文解析为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64990357/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com