【问题标题】:Squeryl NullPointerException on simple database Insert?简单数据库插入上的 Squeryl NullPointerException?
【发布时间】:2012-03-19 04:28:57
【问题描述】:

使用播放! 1.2.4、Scala 和带有 Postgres 的 Squeryl

像往常一样执行简单的数据库插入,突然间数据库开始疯狂地抛出 NullPointerExceptions。当我创建一个可以自动将某人添加到帐户的电子邮件邀请处理程序时,一切都开始了。

代码:

插入发生的Member.scala:

def insert(member:Member) = DB.members.insert(member)

上面的代码是 Play!表示发生 NullPointerException。当我在下面的val member 上运行调试器时,它会显示一个具有适当值的有效成员类。

def invitation(s:Option[String]) = {
    s match {
      case Some(s) => {
        val invite = Invite.getByKey(s)

        invite match {
          case Some(invite) => {
            User.search(invite.email) match {
              case Some(user) => {
                  val member = new Member(user.id,invite.accountId,null)
                  Member.insert( member )
                  session.clear()
                  flash += "notice" -> "Success! Please login to continue."
                  Action(Authentication.login)
              }
              case _ => Action(Users.`new`(s))
            }
          }
          case None => Error("Invite does not exist.")
        }
      }
      case None => Action(Application.index)
    }
  }

堆栈跟踪:

Internal Server Error (500) for request GET /invitation?s=e3dfd60e-bc07-496a-918
1-97c6ea4b0b71

Execution exception (In /app/models/Member.scala around line 59)
NullPointerException occured : null

! play.exceptions.JavaExecutionException
!       at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)
!       at Invocation.HTTP Request(Play!)
! Caused by: java.lang.NullPointerException
!       at org.squeryl.internals.FieldMetaData.get(FieldMetaData.scala:260)
!       at org.squeryl.internals.DatabaseAdapter$class.writeValue(DatabaseAdapte
r.scala:456)
!       at org.squeryl.adapters.PostgreSqlAdapter.writeValue(PostgreSqlAdapter.s
cala:24)
!       at org.squeryl.internals.DatabaseAdapter$$anonfun$writeInsert$2.apply(Da
tabaseAdapter.scala:415)
!       at org.squeryl.internals.DatabaseAdapter$$anonfun$writeInsert$2.apply(Da
tabaseAdapter.scala:415)
!       at org.squeryl.internals.DatabaseAdapter$class.writeInsert(DatabaseAdapt
er.scala:415)
!       at org.squeryl.adapters.PostgreSqlAdapter.writeInsert(PostgreSqlAdapter.
scala:70)
!       at org.squeryl.Table$$anonfun$insert$1.apply(Table.scala:39)
!       at org.squeryl.logging.StackMarker$.lastSquerylStackFrame(StatisticsList
ener.scala:52)
!       at org.squeryl.Table.insert(Table.scala:34)
!       at models.Member$.insert(Member.scala:59)
!       at controllers.Invites$.invitation(Invites.scala:24)
!       at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)

!       at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
!       at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:496)

!       at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)

!       at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
!       ... 1 more

帮助赞赏

以前从未见过,这可能是一个简单的修复,非常感谢您的帮助。

【问题讨论】:

    标签: postgresql scala playframework squeryl


    【解决方案1】:

    这是一个简单的修复,我有点惊讶我在编译期间没有遇到问题。

    在组装我的 Member 类时,我在第三个值上使用了 Scala None 而不是 null,它工作得很好。

    太糟糕了,Squeryl 无法为调试提供更好的错误。

    【讨论】:

    • 不是 Squeryl 的错。 Scala 的设计使得 NullPointerExceptions 很难,而且在大多数情况下是不可能的。我/希望/期望的是编译器警告告诉您您在最可能不合适的地方使用空值。
    • 同意,也许这是未来的功能? ;) 很可能很难正确检测到,因为 null 值不会影响类,但它似乎影响了数据库,但我只是一个新手,很可能不知道我在说什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2013-03-16
    • 2016-05-28
    • 2014-01-25
    相关资源
    最近更新 更多