猿问

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

我试图在 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。

神不在的星期二
浏览 126回答 1
1回答

青春有我

我认为这正在按设计进行。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
随时随地看视频慕课网APP

相关分类

Java
我要回答