我有一个公开端点的应用程序 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
,但在springboot2(2.3.6.release)下,它现在是文本 "some string"
-也就是说,由于没有删除引号,输入似乎没有严格地被解析为json。
我相信带引号的字符串是有效的json(而不带引号的字符串不是),就像对象一样(在 {
以及 }
)和一个列表(在 [
以及 ]
)会的。
我已经拿出一些无关的细节,我认为这些细节与手头的问题无关(例如,我们正在使用 CompletableFuture
作为返回值,我有一个 @PathVariable
还有一些注解驱动的验证),但我留下的是,我们正在使用一个定制的媒体类型,以防与之相关。
我能说服springboot2将我的请求体正确地当作json吗?不幸的是,我无法重新定义api,因为我们已经有了使用它的实时客户。
2条答案
按热度按时间lb3vh1jj1#
您可以创建请求对象
使用myobject类作为requestbody对象
mediaType="application/json"
在你的控制器里lyfkaqu12#
这可能不是最好的选择,但如果一开始没有其他帮助的话。而不是
String
让Spring手柄RequestBody
作为一个Object
. 就像:使用时
String
spring甚至可能不使用jackson进行解析,而是将body作为String
即使内容类型设置为json,也应该在正文中包含所有字符。如果您执行以下操作:
你可以看到它导致
myString2
没有双引号的没有双引号的。为了
Object
spring的处理方式似乎有所不同。它使它成为一个String
但似乎将其视为一个json值(以及String
值,因为它不应该有双引号。如果你使用
Object
然后记录myString.getClass()
你会看到它实际上是一个java.lang.String