在Spring MVC中使用Scala类作为数据传输对象(DTO)

3

我在我的项目中使用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  = _
}

我的问题是在使用Scala Option类作为MyDto字段时,出现了异常:

class MyDto extends Serializable {
   @BeanProperty var id : Option[Long] = None
   @BeanProperty var name: Option[String]  = None
}

异常信息为:

无法将类型为 'java.lang.String' 的属性值转换为必需类型 'scala.Option',用于属性 'name'

我该如何在MyDto中使用Scala选项作为字段类型?


可能会有点复杂,但您需要注册自定义“PropertyEditor”来处理类Option[T]。问题可能在于如何正确处理参数化类型T :-( - millhouse
2个回答

4

我不是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应该可以干净地映射了。

有没有可能不注册所有可以与 Option 一起使用的类型?如果添加新类型,则需要注册一个转换器。我认为注册所有可能的类型并不清晰。 - WelcomeTo
1
由于类型擦除的缘故,它似乎适用于任何选项。我尝试了registry.addConverter(classOf[Any], classOf[Option[Any]], new TypeToOptionOfTypeConverter[Any]),并且它似乎处理了所有选项转换。 - Biju Kunjummen

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接