简单数据库插入Squeryl NullPointerException?

问题描述:

使用Play! 1.2.4,Scala和Squgyl与Postgres简单数据库插入Squeryl NullPointerException?

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

代码:

Member.scala其中,该插入发生:

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

上面的代码就是玩!指示发生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 

帮助表示赞赏

从未见过这一点,它可能是一个简单的修复,你的帮助是非常赞赏。

这是一个简单的修复,我有点惊讶,我没有在编译过程中出现呃逆。

当组装我的成员类时,我使用Scala None而不是null作为第三个值,它工作得很好。

Squeryl无法提供更好的调试错误。

+0

不是Squeryl的错。 Scala的设计使NullPointerExceptions难以运行,并且在大多数情况下不可能运行。我/将会/期望的是,编译器警告告诉你,在最有可能不适用的情况下使用空值。 – 2012-03-19 13:22:49

+0

同意,也许这是未来的功能? ;)很可能很难正确检测,因为null值不影响类,但它似乎影响了数据库,但我只是一个新手,很可能不知道我在说什么。 – crockpotveggies 2012-03-19 19:39:20