在我的项目中,我使用的是Spring + Scala。
我的一些Spring MVC控制器使用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 = _
}
我的问题是,在尝试对Option
中的字段使用Scala MyDto
类时,我遇到了异常:
class MyDto extends Serializable {
@BeanProperty var id : Option[Long] = None
@BeanProperty var name: Option[String] = None
}
异常消息是:
Failed to convert property value of type 'java.lang.String' to required type 'scala.Option' for property 'name';
如果MyDto
中的字段?
答案 0 :(得分:3)
我不是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应该得到干净的映射。
答案 1 :(得分:0)
Spring支持使用带有数据绑定的转换器转换类型。您需要实现转换器,以便Spring知道如何将String转换为Option [String]。