微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Spring MVC中将Scala类用作DTO

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

我的问题是,当尝试对MyDto中的字段使用Scala Option类时遇到异常:

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

异常消息是:

无法将类型“ java.lang.String”的属性值转换为属性名称”的必需类型“ scala.Option”;

如果MyDto中的字段使用Scala选项作为类型,我该怎么办?

解决方法:

我不是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应该已经清晰地映射了.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐