为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot中的ObjectMapper可以读取字符串,但在解析标头时不起作用

Spring Boot中的ObjectMapper可以读取字符串,但在解析标头时不起作用

神不在的星期二 2023-12-13 17:08:07
我试图在 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)。

这记录在https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-typeconversion

如果参数声明为 String 之外的其他内容,则表示基于 String 的请求输入(例如@RequestParam@RequestHeader@PathVariable@MatrixVariable@CookieValue)的某些带注释的控制器方法参数可能需要类型转换。

对于这种情况,会根据配置的转换器自动应用类型转换

https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-requestbody

您可以使用@RequestBody注释通过以下方式读取请求正文并将其反序列化为对象:HttpMessageConverter


查看完整回答
反对 回复 2023-12-13
  • 1 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信