java—在SpringBoot2中解析一个请求体,其中包含一个带引号的字符串作为json

cwxwcias  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(410)

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

  1. PUT /my/endpoint
  2. "some string"

我的端点方法签名类似于:

  1. @RequestMapping(
  2. path = "/my/endpoint",
  3. consumes = "application/vnd.mycompany.myservice-v1.hal+json"
  4. )
  5. public ResponseEntity<MyResponse> myEndpoint(
  6. @RequestBody final String myString
  7. ) {
  8. ...
  9. }

使用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,因为我们已经有了使用它的实时客户。

lb3vh1jj

lb3vh1jj1#

您可以创建请求对象

  1. public class MyObject{
  2. private String myStr;
  3. }

使用myobject类作为requestbody对象 mediaType="application/json" 在你的控制器里

  1. @RequestMapping(
  2. value= "/my/endpoint", method= RequestMethod.PUT
  3. )
  4. public ResponseEntity<MyResponse> myEndpoint(
  5. @RequestBody final MyObject myObj
  6. )
lyfkaqu1

lyfkaqu12#

这可能不是最好的选择,但如果一开始没有其他帮助的话。而不是 String 让Spring手柄 RequestBody 作为一个 Object . 就像:

  1. public ResponseEntity<String> myEndpoint(@RequestBody final Object myString)

使用时 String spring甚至可能不使用jackson进行解析,而是将body作为 String 即使内容类型设置为json,也应该在正文中包含所有字符。
如果您执行以下操作:

  1. String myString2 = new ObjectMapper().readValue(myString, String.class);

你可以看到它导致 myString2 没有双引号的没有双引号的。
为了 Object spring的处理方式似乎有所不同。它使它成为一个 String 但似乎将其视为一个json值(以及 String 值,因为它不应该有双引号。
如果你使用 Object 然后记录 myString.getClass() 你会看到它实际上是一个 java.lang.String

相关问题