2015-03-31 23 views
3

在我的项目中,我使用了Spring + Scala。在Spring MVC中使用Scala类作为DTO

我的一些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 
} 

异常消息是:

Failed to convert property value of type 'java.lang.String' to required type 'scala.Option' for property 'name';

我可以做什么使用Scala选项作为类型如果字段在MyDto

+0

它可能会有点复杂,但您需要[注册一个自定义的'PropertyEditor'](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation .html#beans-beans-conversion-customeditor-registration)来处理'Option [T]'类。问题很可能是它正确处理参数化类型'T' :-( – millhouse 2015-03-31 23:22:59

回答

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应该干净地映射。

+0

是否有可能不会注册所有可以使用'Option'的类型?如果将添加新类型,那么我需要我想注册所有可能的类型不清楚 – MyTitle 2015-04-03 13:26:29

+1

由于类型擦除它似乎适用于任何选项。我试过这个'registry.addConverter(classOf [Any],classOf [Option [Any]],new TypeToOptionOfTypeConverter [Any])',它似乎处理所有选项转换 – 2015-04-03 22:26:49