0

I have a Kotlin Springboot app that uses springdoc-openapi for generating Swagger documentation.

The app uses snake case as the default, but there is one endpoint where I had to use camel case. So I added 2 object mappers to Jackson2HttpMessageConverter:

@Bean //overwrites the autoconfigured objectMapper
fun mappingJackson2HttpMessageConverter(
  snakecaseObjectMapper: ObjectMapper
): MappingJackson2HttpMessageConverter? {
  val bean = MappingJackson2HttpMessageConverter()
  //default object mapper
  bean.objectMapper = snakecaseObjectMapper

  //register custom object mappers
  bean.registerObjectMappersForType(
    CamelCaseDataClass::class.java
  ) { m: MutableMap<MediaType?, ObjectMapper?> ->  //!!
    m[MediaType.APPLICATION_JSON] = camelCaseObjectMapper()
  }

  return bean
}

SideNote:- The reason for doing this in config and not directly on CamelCaseDataClass POJO class with @JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy::class) is because now the camel case object mapper is applied in child classes as well. The child class might be used in other endpoints which should be in snake case or camel case depending on the endpoint.

In the current code, the springdoc-openapi is just using snakecase object mapper as below:

@Bean
fun modelResolver(snakecaseObjectMapper: ObjectMapper): ModelResolver {
  return ModelResolver(snakecaseObjectMapper)
}

How can I make the springdoc-openapi use an object mapper dynamically based on the one used by Jackson?

firstpostcommenter
  • 2,328
  • 4
  • 30
  • 59

0 Answers0