1

我从这个开始(在 Play Action 方法中):

    val foo = JPA.em.find(classOf[Foo], id)
    if (foo == null) NotFound("Bad Id") else Ok(Json.toJson(foo))

不像它的必要性,我去了这个:

    Option(JPA.em.find(classOf[Foo], id)) match {
      case Some(foo) => Ok(Json.toJson(foo))
      case None => NotFound("Bad Id")
    }

更实用,但更长。

对于这个问题的笼统性质,我深表歉意,但我敢打赌,答案可能对许多人有所帮助。

4

2 回答 2

4
Option(JPA.em.find(classOf[Foo], id)).map(foo=>Ok(Json.toJson(foo))).getOrElse(NotFound("Bad Id"))
于 2013-07-13T19:02:20.860 回答
1

绝对值得用一些返回Options 的可重用方法来包装像这样的不安全的 Java API,例如

def findOpt[T](cls: Class[T], id: Object): Option[T] =
  Option(JPA.em.find(cls, id))

使用此 API,而不是直接使用 JPA,意味着您无需担心代码中其他地方的空值检查。这一切都在一个地方处理。

现在,您可以决定是否使用match, 或fold, 或map/ getOrElse; 重要的是,结果的可能缺失以findOpt.

findOpt(classOf[Foo], id) map (foo => OK(Json.toJson(foo)) getOrElse NotFound("Bad Id")
于 2013-07-17T20:27:50.143 回答