或者你可以告诉Spring使用
ScalaObjectMapper
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.12</artifactId>
<version>2.9.7</version>
</dependency>
WebMvcConfigurerAdapter
. 例子;
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import scala.collection.JavaConverters._
@EnableWebMvc
@Configuration
@PropertySource(Array("classpath:config/default.properties"))
@ComponentScan(Array(
"com.prayagupd"
))
@Order(HIGHEST_PRECEDENCE)
class MyAppConfig extends WebMvcConfigurerAdapter {
override def extendMessageConverters(converters: java.util.List[HttpMessageConverter[_]]): Unit = {
val encodeDecoderOpt = converters.asScala.collectFirst { case p: MappingJackson2HttpMessageConverter => p }
val jacksonConverter = encodeDecoderOpt.getOrElse(new MappingJackson2HttpMessageConverter)
jacksonConverter.setObjectMapper(Config.objectMapper)
if (encodeDecoderOpt.isEmpty) // because converters is mutable
converters.add(jacksonConverter)
}
}
object Config {
@Bean
def objectMapper: ObjectMapper = {
new ObjectMapper() with ScalaObjectMapper
}.registerModule(DefaultScalaModule)
}
@RestController
@CrossOrigin(origins = Array("*"))
@RequestMapping(value = Array("/"))
class MyController @Autowired()(implicit val jacksonObjectMapper: ObjectMapper) {
import MyController._
@Async
@RequestMapping(value = Array("/talk"), method = Array(RequestMethod.POST), consumes = Array(MediaType.APPLICATION_JSON_VALUE), produces = Array(MediaType.APPLICATION_JSON_VALUE))
def talk(@RequestBody request: MyRequest): MyResponse = {
// goes here
}
}
//expose these in client jar if you want
object MyController {
final case class MyRequest(includeMovies: Boolean, includeTvShows: Boolean, somethingElse: List[String])
final case class MyResponse(whatever: String)
}