spring - 在 Spring MVC 中使用 Scala 类作为 DTO

标签 spring scala spring-mvc

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

我的一些 Spring MVC Controller 使用 Spring 功能将传入的 HTTP 参数绑定(bind)到 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”的属性值转换为属性“name”所需的类型“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 应该得到清晰的映射。

关于spring - 在 Spring MVC 中使用 Scala 类作为 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29377191/

相关文章:

java - 如何并行运行任务并在第一个任务失败时等待第二个任务,否则回复并让第二个任务运行

java - 运行 spring boot build : Error creating bean with name 'entityManagerFactory' defined in class path

algorithm - 使用 Scala 抛硬币

java - 当应用 Future 和 ThreadPools 进行多线程时,Scala Process 永远不会结束

java - Spring MVC : using @ResponseStatus(reason = '' ) on a @ResponseBody exception handler in tomcat

java - 没有 Spring Security 的 Spring Java 登录

java - 如何使用Spring管理与多个数据库的连接

scala - 如何在 Play 2.6.x 中将 java.io.File 转换为 Scala 临时文件

java - 在 Spring MVC 中,无法使用 Jackson @JsonFormat 将输入绑定(bind)到日期字段

java - Spring @RestController