在Spring MVC中使用Scala类作为DTO

时间:2015-03-31 19:43:56

标签: spring scala spring-mvc

在我的项目中,我使用的是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中的字段?

,我可以使用Scala选项作为类型

2 个答案:

答案 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]。

请参阅: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert