2012-03-19 2 views
1

Использование Play! 1.2.4, Scala и Squeryl с PostgresSqueryl NullPointerException в простой базе данных Вставить?

Выполнение простой вставки DB, как обычно, и внезапно база данных начала бросать 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 

Помощь оценили

не видел это раньше, и это может быть легко исправить, ваша помощь очень ценится.

ответ

0

Это было легко исправить, и я немного удивлен, что во время компиляции я не получил икоту.

При сборке моего класса участников я использовал Scala None вместо null по этому третьему значению, и он работал нормально.

Слишком плохо. Squeryl не может выпустить лучшую ошибку для отладки.

+0

Не недостаток Squeryl. Scala спроектирован так, что NullPointerExceptions сложны и в большинстве случаев невозможны. То, что я/ожидал, - это предупреждение о компиляторе, указывающее, что вы используете нули, где это, скорее всего, неприемлемо. –

+0

Согласен, может быть, это функция будущего? ;) вполне возможно, что это может быть трудно правильно обнаружить, поскольку нулевое значение не влияет на класс, но, похоже, оно повлияло на базу данных, но я только новичок и очень хорошо, возможно, не знаю, о чем я говорю. – crockpotveggies

Смежные вопросы