我试图在 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
提交
取消