我遇到了一個奇怪的問題。為什么第一個代碼接受不帶引號的輸入,而第二個不接受?
老實說,第二個是有道理的。但是為什么第一個接受不帶引號的輸入?
我真的很想知道為什么做出這個決定。
package com.example.corntest;
import lombok.extern.log4j.Log4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE;
@SpringBootApplication
@RestController
public class CornTestApplication {
public static void main(String[] args) {
SpringApplication.run(CornTestApplication.class, args);
}
//works - does NOT remove quotation marks
//curl 'http://localhost:8080/test' -X POST -H 'Content-Type: application/json' --data-raw '"SunGoesUp"' -vv
//works - but doesnt make sense - in comp. to code made in the bottom
//curl 'http://localhost:8080/test' -X POST -H 'Content-Type: application/json' --data-raw 'SunGoesUp' -vv
@PostMapping(value = "/test", consumes = APPLICATION_JSON_VALUE)
void mytestPost(@RequestBody String myString){
System.out.println(myString);
}
enum Test {
TESTA,
TESTB,
TESTC
}
//works
//curl 'http://localhost:8080/testEnum' -X POST -H 'Content-Type: application/json' --data-raw '"TESTA"' -vv
//does not work
//curl 'http://localhost:8080/testEnum' -X POST -H 'Content-Type: application/json' --data-raw 'TESTA' -vv
//Why
@PostMapping(value = "/testEnum", consumes = APPLICATION_JSON_VALUE)
void myTestEnum(@RequestBody Test myEnumValue){
System.out.println(myEnumValue);
}
}
uj5u.com熱心網友回復:
在您使用@RequestBody String myStringhttp 請求的有效負載的情況下,按原樣放置在那里。所以你發送的任何東西都會放在那里。內容型別無關緊要,因為它會按原樣復制請求的有效負載。
在第二種情況下,需要實際的 JSON 字串才能轉換為列舉。基于 JSON 的字串需要有引號,否則它不是 JSON 字串。不能將字串以外的內容轉換為列舉。
要將主體的有效負載轉換為請求的物件,Spring 使用 [ HttpMessageConverter]。它將HttpMessageConverter根據Content-Type標題選擇正確的。在您的情況下,假設默認值,這將導致MappingJackson2HttpMessageConverter. 這將使用正文轉換為列舉。這將失敗,因為它不是有效的 JSON 字串(沒有引號)。
這里解釋了什么是 JSON 中的字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384511.html
