在scala play框架中处理null case

时间:2016-12-15 16:48:16

标签: scala

我有以下POST正文示例:

{ "Id": "123abxy"}

{ "customUrl": "http://www.whiskey.com","Id": "123abxy"}

{ "size": "88", "customUrl": "http://www.whiskey.com","Id": "123abxy"}

以下终点:

case class aType(
    customUrl: Option[String],
    Id:Option[String],
    size:Option[String]
  )

@ResponseBody
  def addCompany(
    @RequestBody a: aType,
    @ModelAttribute("action-context") actionContext: ActionContext
  ): DeferredResult[Created] = Action[Created] 
{

    val customUrl =  {
      a.customUrl
    }

    val size  = {
      if (a.size == None) {None}
      else Option(a.size.get.toLong)
    }

    val Id = {
          a.Id
    }

    val handle = register(
      customUrl,
      Id,
      size
    ).run()

  }.runForSpring[Nothing](executors, actionContext)

此外:

def register(
    customUrl: Option[String],
    Id: Option[String],
    size: Option[Long]
  )

鉴于上述情况,我想知道处理sizecustomUrl未传递到POST Body的情况的正确方法。

在这种情况下,由于size可以是值(Long)或nullcustomUrl可以是String或{{1我认为处理这个问题的正确数据类型分别是nullOption[String] Option[Long]customUrl

我的问题是如何更改size子句以处理上述null或if-else / String的方案,以便我可以将有效变量传递到Long功能?

干杯,

1 个答案:

答案 0 :(得分:0)

如果register函数接收大小并将customURL作为选项,那么问题是什么?

我会做这样的事情:

@ResponseBody
  def addCompany(
    @RequestBody a: aType,
    @ModelAttribute("action-context") actionContext: ActionContext
  ): DeferredResult[Created] = Action[Created] 
{
    val handle = register(a.customUrl,a.id,a.size).run()

  }.runForSpring[Nothing](executors, actionContext)

如果未定义None,则需要返回size

 @ResponseBody
      def addCompany(
        @RequestBody a: aType,
        @ModelAttribute("action-context") actionContext: ActionContext
      ): DeferredResult[Created] = Action[Created] 
    {

        val sizeOpt = a.size

        val handle =sizeOpt.map { size =>
          register(a.customUrl,a.id,Some(size)).run()
        }

      }.runForSpring[Nothing](executors, actionContext)

但更好的是,你的寄存器函数不是指望Option,而只处理原始类型。然后你只需要映射3个可选值(我建议用于理解):

for {
  size <- a.size
  url <- a.customUrl
  id <- a.id
} yield register(url, id, size).run()

寄存器定义为:

def register(
    customUrl:String,
    Id: String,
    size: Long
  )