我一直在为我的游戏项目使用Slick 2 for DB mgmt,但是下面的方法是抛出Null Pointer Exception
而我实际上无法找出抛出异常的原因。
其他与数据库相关的功能正常工作,就像我可以使用evolution插件创建表格一样。
val userProjection: TableQuery[UserProjection] = TableQuery[UserProjection]
def fetch(identity: IdentityId): Option[Users] = {
val user = identity.userId
//user is not null
val query = userProjection.filter(_.userId === user)// Exception thrown in this line
//val query = userProjection.filter(value => value.userId === identity.userId && value.providerId === identity.providerId)
val result = SQLDB.withSession { implicit session =>
val res = query.list
if (res.size > 0) {
res.headOption
} else {
None
}
}
if (result != None) {
Some(convertSingleResultSet(result))
} else {
None
}
}
投影类
class UserProjection(tag: Tag) extends Table[Users](tag, "identities_47") {
implicit def string2AuthenticationMethod = MappedColumnType.base[AuthenticationMethod, String](
authenticationMethod => authenticationMethod.method,
string => AuthenticationMethod(string))
implicit def tuple2OAuth1Info(tuple: (Option[String], Option[String])): Option[OAuth1Info] = tuple match {
case (Some(token), Some(secret)) => Some(OAuth1Info(token, secret))
case _ => None
}
implicit def tuple2OAuth2Info(tuple: (Option[String], Option[String], Option[Int], Option[String])): Option[OAuth2Info] = tuple match {
case (Some(token), tokenType, expiresIn, refreshToken) => Some(OAuth2Info(token, tokenType, expiresIn, refreshToken))
case _ => None
}
implicit def tuple2PasswordInfo(tuple: (Option[String], Option[String], Option[String])) = tuple match {
case (Some(hasher), Some(password), salt) =>
Some(PasswordInfo(hasher, password, salt))
case _ => None
}
implicit def tuple2IdentityId(tuple: (String, String)): IdentityId = tuple match {
case (userId, providerId) => IdentityId(userId, providerId)
}
//def uid = column[Long]("id", O.PrimaryKey, O.AutoInc)
def userId = column[String]("userId")
def providerId = column[String]("providerId")
def email = column[Option[String]]("email")
def firstName = column[String]("firstName")
def lastName = column[String]("lastName")
def fullName = column[String]("fullName")
def authMethod = column[AuthenticationMethod]("authMethod")
def avatarUrl = column[Option[String]]("avatarUrl")
// oAuth 1
def token = column[Option[String]]("token")
def secret = column[Option[String]]("secret")
// oAuth 2
def accessToken = column[Option[String]]("accessToken")
def tokenType = column[Option[String]]("tokenType")
def expiresIn = column[Option[Int]]("expiresIn")
def refreshToken = column[Option[String]]("refreshToken")
//PasswordInfo
def hasher = column[Option[String]]("hasher")
def password = column[Option[String]]("password")
def salt = column[Option[String]]("salt")
def * : ProvenShape[Users] = {
val shapedValue = (
userId,
providerId,
firstName,
lastName,
fullName,
email,
avatarUrl,
authMethod,
token,
secret,
accessToken,
tokenType,
expiresIn,
refreshToken,
hasher,
password,
salt).shaped
shapedValue.<>({
tuple =>
Users.apply(
identityId = tuple2IdentityId(tuple._1, tuple._2),
firstName = tuple._3,
lastName = tuple._4,
fullName = tuple._5,
email = tuple._6,
avatarUrl = tuple._7,
authMethod = tuple._8,
oAuth1Info = (tuple._9, tuple._10),
oAuth2Info = (tuple._11, tuple._12, tuple._13, tuple._14),
passwordInfo = (tuple._15, tuple._16, tuple._17))
}, {
(u: Users) =>
Some {
(u.identityId.userId,
u.identityId.providerId,
u.firstName,
u.lastName,
u.fullName,
u.email,
u.avatarUrl,
u.authMethod,
u.oAuth1Info.map(_.token),
u.oAuth1Info.map(_.secret),
u.oAuth2Info.map(_.accessToken),
u.oAuth2Info.flatMap(_.tokenType),
u.oAuth2Info.flatMap(_.expiresIn),
u.oAuth2Info.flatMap(_.refreshToken),
u.passwordInfo.map(_.hasher),
u.passwordInfo.map(_.password),
u.passwordInfo.flatMap(_.salt))
}
})
}
}
和堆栈跟踪,
play.api.Application$$anon$1: Execution exception[[NullPointerException: null]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10-2.2.3.jar:2.2.3]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10-2.2.3.jar:2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$13$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:166) [play_2.10-2.2.3.jar:2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$13$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:163) [play_2.10-2.2.3.jar:2.2.3]
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33) [scala-library-2.10.4.jar:na]
at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:185) [scala-library-2.10.4.jar:na]
Caused by: java.lang.NullPointerException: null
at models.dao.UsersDao$.fetch(UsersDao.scala:153) ~[classes/:na]
at controllers.Facebooks$$anonfun$authorize$1.apply(Facebooks.scala:121) ~[classes/:na]
at controllers.Facebooks$$anonfun$authorize$1.apply(Facebooks.scala:112) ~[classes/:na]
at play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:221) ~[play_2.10-2.2.3.jar:2.2.3]
at play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:220) ~[play_2.10-2.2.3.jar:2.2.3]
at play.api.mvc.Action$.invokeBlock(Action.scala:357) ~[play_2.10-2.2.3.jar:2.2.3]