我試圖在 spring boot 中將枚舉值作為標頭參數提供給我的其余端點@RestController。為此,我將杰克遜庫放入我的build.gradle文件中,因為自動生成的枚舉使用了杰克遜注釋。我無法更改枚舉代碼(它是根據 openapi 規范自動生成的)。它看起來像這樣:public enum DocumentTypes { APPLICATION_PDF("application/pdf"), APPLICATION_RTF("application/rtf"), APPLICATION_VND_OASIS_OPENDOCUMENT_TEXT("application/vnd.oasis.opendocument.text"), APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_WORDPROCESSINGML_DOCUMENT("application/vnd.openxmlformats-officedocument.wordprocessingml.document"), APPLICATION_VND_MS_WORD("application/vnd.ms-word"), TEXT_HTML("text/html"), TEXT_PLAIN("text/plain"); private String value; DocumentTypes(String value) { this.value = value; } @Override @JsonValue public String toString() { return String.valueOf(value); } @JsonCreator public static DocumentTypes fromValue(String text) { for (DocumentTypes b : DocumentTypes.values()) { if (String.valueOf(b.value).equals(text)) { return b; } } throw new IllegalArgumentException("Unexpected value '" + text + "'"); }}我用來測試的其余控制器如下所示:@RestController@RequestMapping("/test")public class TestController { @Autowired private ObjectMapper objectMapper; @RequestMapping(path = "", method = RequestMethod.GET) public void test(@RequestHeader(value = "Accept", required = false) DocumentTypes targetFormat) throws IOException { DocumentTypes value = objectMapper.readValue("\"application/pdf\"", DocumentTypes.class); }}如果我不提供 Accept 標頭,而只是在代碼中中斷,我可以看到代碼的第一行工作正常,字符串application/pdf被轉換為,value因此ObjectMapper使用該方法完成了它的工作@JsonCreator。
1 回答

青春有我
TA貢獻1784條經驗 獲得超8個贊
我認為這正在按設計進行。Spring 僅使用 JacksonObjectMapper
來轉換消息體(使用注冊的HttpMessageConverter
,特別是MappingJackson2HttpMessageConverter
)。
如果參數聲明為 String 之外的其他內容,則表示基于 String 的請求輸入(例如
@RequestParam
、@RequestHeader
、@PathVariable
、@MatrixVariable
和@CookieValue
)的某些帶注釋的控制器方法參數可能需要類型轉換。對于這種情況,會根據配置的轉換器自動應用類型轉換
和https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-requestbody:
您可以使用
@RequestBody
注釋通過以下方式讀取請求正文并將其反序列化為對象:HttpMessageConverter
添加回答
舉報
0/150
提交
取消