在SpringMVC中使用Scala类作为DTO

在SpringMVC中使用Scala类作为DTO,spring,scala,spring-mvc,Spring,Scala,Spring Mvc,在我的项目中,我使用Spring+Scala 我的一些SpringMVC控制器使用Spring特性将传入的HTTP参数绑定到DTO对象。像这样: @RequestMapping(value = Array("/", ""), method = Array(RequestMethod.POST)) def saveProduct(dto: MyDto): Iterable[MyDto] = {...} 而MyDto是一个简单的scala类: class MyDto extends

在我的项目中,我使用Spring+Scala

我的一些SpringMVC控制器使用Spring特性将传入的HTTP参数绑定到DTO对象。像这样:

    @RequestMapping(value = Array("/", ""), method = Array(RequestMethod.POST))
    def saveProduct(dto: MyDto): Iterable[MyDto] = {...}
MyDto
是一个简单的scala类:

class MyDto extends Serializable {
   @BeanProperty var id : Long = _
   @BeanProperty var name: String  = _
}
我的问题是,我在尝试对
MyDto
中的字段使用Scala
选项时遇到异常:

class MyDto extends Serializable {
   @BeanProperty var id : Option[Long] = None
   @BeanProperty var name: Option[String]  = None
}
例外消息是:

无法将类型为“java.lang.String”的属性值转换为属性“name”所需的类型“scala.Option”


如果
MyDto
中的字段使用Scala选项作为type if,我能做什么?

Spring支持使用转换器及其数据绑定转换类型。您需要实现转换器,以便Spring知道如何将字符串转换为选项[String]

见:

我不是Scala专家,但有一种方法:

创建一个转换器,沿着以下几行:

import org.springframework.core.convert.converter.Converter

class TypeToOptionOfTypeConverter[T] extends Converter[T, Option[T]] {
  override def convert(source: T): Option[T] = {
    Some(source)
  }
}
向Spring MVC注册此转换器:

class WebConfig extends WebMvcConfigurerAdapter {
  override def addFormatters(registry: FormatterRegistry): Unit = {
    registry.addConverter(classOf[String], classOf[Option[String]], new TypeToOptionOfTypeConverter[String])
    registry.addConverter(classOf[Long], classOf[Option[Long]], new TypeToOptionOfTypeConverter[Long])
  }
}

应该是这样,现在您的DTO应该得到清晰的映射。

它可能有点复杂,但您需要处理类
选项[T]
。问题很可能是让它正确处理参数化类型
T
:-(是否可以不注册可与
选项一起使用的所有可能类型?
?如果要添加新类型,则我需要再注册一个转换器。我认为在not Clear中注册所有可能的类型似乎对任何选项都有效。我尝试了此
注册表.addConverter(classOf[any],classOf[Option[Any]],new-TypeToOptionOfTypeConverter[Any])
并且它似乎可以处理所有选项转换