播放 2.4 Finder 抛出空指针异常
Play 2.4 Finder throws Null Pointer Exception
我目前在 Play 2.4 中遇到一个 Finder 实例的问题,它 returns 在使用时出现空指针异常。这是尝试使用它的代码
public ExpressionList<ClientAuthorization> getAuthorizationQuery(String appId) {
return ClientAuthorization.find.where().eq("app_id", appId).eq("active", 1);
}
和模型class
package models;
import com.avaje.ebean.Model;
import javax.persistence.*;
import java.sql.Timestamp;
@Entity
@Table(name="client_authorization")
public class ClientAuthorization extends Model {
public static final Finder<Long, ClientAuthorization> find = new Finder<>(ClientAuthorization.class);
@Id
public long clientAuthorizationId;
@Column(nullable=false, length=45)
public String appId;
@Column(nullable=false, length=45)
public String apiKey;
@Column(nullable=false)
public boolean active;
@Column(nullable = false)
public boolean isAdmin;
@Column(nullable=false)
public Timestamp createdDate;
@Column(nullable=false)
public Timestamp updatedDate;
@PrePersist
protected void createdAt() {
this.createdDate = new Timestamp(System.currentTimeMillis());
this.updatedDate = new Timestamp(System.currentTimeMillis());
}
@PostPersist
protected void updatedAt() {
this.updatedDate = new Timestamp(System.currentTimeMillis());
}
}
这适用于我在 Play 中创建的每个模型,所以我不确定发生了什么。这是我得到的
我非常感谢能得到的任何帮助。在我正在进行的升级项目中,这让我发疯。我做的最后一次升级还不错,但是这次却给我带来了问题。
附加信息:在对 find
的 ClientAuthorization 静态调用之后调用 where() 失败
更新
既然它出现在评论中,这不仅仅是一个 NPE 是什么的问题,我已经知道了。由于某种原因,查找器未初始化。然而,看看这个模型,以及我写过的每个模型,没有理由发生这种情况。
这是堆栈跟踪
@6o9455j27 - Internal server error, for (GET) [/] ->
play.api.http.HttpErrorHandlerExceptions$$anon: Execution exception[[NullPointerException: null]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:265) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:191) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.GlobalSettings$class.onError(GlobalSettings.scala:179) [play_2.11-2.4.4.jar:2.4.4]
at play.api.DefaultGlobal$.onError(GlobalSettings.scala:212) [play_2.11-2.4.4.jar:2.4.4]
at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:94) [play_2.11-2.4.4.jar:2.4.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$$anonfun$apply.applyOrElse(PlayDefaultUpstreamHandler.scala:151) [play-netty-server_2.11-2.4.4.jar:2.4.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$$anonfun$apply.applyOrElse(PlayDefaultUpstreamHandler.scala:148) [play-netty-server_2.11-2.4.4.jar:2.4.4]
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36) [scala-library-2.11.6.jar:na]
at scala.util.Failure$$anonfun$recover.apply(Try.scala:215) [scala-library-2.11.6.jar:na]
at scala.util.Try$.apply(Try.scala:191) [scala-library-2.11.6.jar:na]
at scala.util.Failure.recover(Try.scala:215) [scala-library-2.11.6.jar:na]
at scala.concurrent.Future$$anonfun$recover.apply(Future.scala:324) [scala-library-2.11.6.jar:na]
at scala.concurrent.Future$$anonfun$recover.apply(Future.scala:324) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) [scala-library-2.11.6.jar:na]
at play.api.libs.iteratee.Execution$trampoline$.executeScheduled(Execution.scala:109) [play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:71) [play-iteratees_2.11-2.4.4.jar:2.4.4]
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) [scala-library-2.11.6.jar:na]
at scala.concurrent.Promise$class.complete(Promise.scala:55) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23) [scala-library-2.11.6.jar:na]
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) [akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [akka-actor_2.11-2.3.13.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.6.jar:na]
Caused by: java.lang.NullPointerException: null
at com.avaje.ebean.Model$Find.query(Model.java:547) ~[avaje-ebeanorm-4.6.2.jar:na]
at com.avaje.ebean.Model$Find.where(Model.java:741) ~[avaje-ebeanorm-4.6.2.jar:na]
at repositories.AuthRepository.getAuthorizationQuery(AuthRepository.java:12) ~[classes/:na]
at interceptors.AuthInterceptor.call(AuthInterceptor.java:31) ~[classes/:na]
at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:94) ~[play_2.11-2.4.4.jar:2.4.4]
at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:94) ~[play_2.11-2.4.4.jar:2.4.4]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
at play.core.j.HttpExecutionContext$$anon.run(HttpExecutionContext.scala:40) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) [play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32) ~[play_2.11-2.4.4.jar:2.4.4]
at scala.concurrent.impl.Future$.apply(Future.scala:31) ~[scala-library-2.11.6.jar:na]
at scala.concurrent.Future$.apply(Future.scala:492) ~[scala-library-2.11.6.jar:na]
at play.core.j.JavaAction.apply(JavaAction.scala:94) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply$$anonfun$apply.apply(Action.scala:105) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply$$anonfun$apply.apply(Action.scala:105) ~[play_2.11-2.4.4.jar:2.4.4]
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply.apply(Action.scala:104) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply.apply(Action.scala:103) ~[play_2.11-2.4.4.jar:2.4.4]
at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na]
at play.api.mvc.Action$$anonfun$apply.apply(Action.scala:103) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply.apply(Action.scala:96) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$mapM.apply(Iteratee.scala:524) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$mapM.apply(Iteratee.scala:524) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM.apply(Iteratee.scala:560) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM.apply(Iteratee.scala:560) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$$anonfun$apply.apply(Iteratee.scala:536) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$$anonfun$apply.apply(Iteratee.scala:536) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
... 6 common frames omitted
我认为您需要使用 com.avaje.ebean.Model.Find 而不是 Model.Finder class。
public static final Find<Long,ClientAuthorization> find = new Find<Long,ClientAuthorization>(){};
或者,您可以使用 play.db.ebean。Model.Finder
public static Finder<Long,ClientAuthorization> find = new Finder<Long,ClientAuthorization>( Long.class, ClientAuthorization.class );
我没有测试过,请检查并告诉我。请 post 异常跟踪以便更好地理解。
略微查看源代码表明,在您正在为其构建 find
对象的同一个 class 中拥有一个静态初始化的 find
对象可能不是一个好主意。我会:
- 首先从模型中完全删除此变量 class 并在其他地方创建该字段。
- 或者(如果你必须在那里)在第一次请求对象时延迟初始化它。
前段时间我遇到了一个非常令人难以置信的问题,静态字段引用包含 class 类型并产生意外行为。
万一有人遇到类似问题,配置应该仔细检查。默认的 Model 超类不关心它。有关 aplication.conf
和 orm.xml
的详细信息,请参见此处:
在创建静态 Finder 时指定服务器名称对我有用
Finder<String, Site> find = new Finder<String, Site>([servername], Site.class);
我目前在 Play 2.4 中遇到一个 Finder 实例的问题,它 returns 在使用时出现空指针异常。这是尝试使用它的代码
public ExpressionList<ClientAuthorization> getAuthorizationQuery(String appId) {
return ClientAuthorization.find.where().eq("app_id", appId).eq("active", 1);
}
和模型class
package models;
import com.avaje.ebean.Model;
import javax.persistence.*;
import java.sql.Timestamp;
@Entity
@Table(name="client_authorization")
public class ClientAuthorization extends Model {
public static final Finder<Long, ClientAuthorization> find = new Finder<>(ClientAuthorization.class);
@Id
public long clientAuthorizationId;
@Column(nullable=false, length=45)
public String appId;
@Column(nullable=false, length=45)
public String apiKey;
@Column(nullable=false)
public boolean active;
@Column(nullable = false)
public boolean isAdmin;
@Column(nullable=false)
public Timestamp createdDate;
@Column(nullable=false)
public Timestamp updatedDate;
@PrePersist
protected void createdAt() {
this.createdDate = new Timestamp(System.currentTimeMillis());
this.updatedDate = new Timestamp(System.currentTimeMillis());
}
@PostPersist
protected void updatedAt() {
this.updatedDate = new Timestamp(System.currentTimeMillis());
}
}
这适用于我在 Play 中创建的每个模型,所以我不确定发生了什么。这是我得到的
我非常感谢能得到的任何帮助。在我正在进行的升级项目中,这让我发疯。我做的最后一次升级还不错,但是这次却给我带来了问题。
附加信息:在对 find
的 ClientAuthorization 静态调用之后调用 where() 失败更新
既然它出现在评论中,这不仅仅是一个 NPE 是什么的问题,我已经知道了。由于某种原因,查找器未初始化。然而,看看这个模型,以及我写过的每个模型,没有理由发生这种情况。
这是堆栈跟踪
@6o9455j27 - Internal server error, for (GET) [/] ->
play.api.http.HttpErrorHandlerExceptions$$anon: Execution exception[[NullPointerException: null]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:265) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:191) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.GlobalSettings$class.onError(GlobalSettings.scala:179) [play_2.11-2.4.4.jar:2.4.4]
at play.api.DefaultGlobal$.onError(GlobalSettings.scala:212) [play_2.11-2.4.4.jar:2.4.4]
at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:94) [play_2.11-2.4.4.jar:2.4.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$$anonfun$apply.applyOrElse(PlayDefaultUpstreamHandler.scala:151) [play-netty-server_2.11-2.4.4.jar:2.4.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$$anonfun$apply.applyOrElse(PlayDefaultUpstreamHandler.scala:148) [play-netty-server_2.11-2.4.4.jar:2.4.4]
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36) [scala-library-2.11.6.jar:na]
at scala.util.Failure$$anonfun$recover.apply(Try.scala:215) [scala-library-2.11.6.jar:na]
at scala.util.Try$.apply(Try.scala:191) [scala-library-2.11.6.jar:na]
at scala.util.Failure.recover(Try.scala:215) [scala-library-2.11.6.jar:na]
at scala.concurrent.Future$$anonfun$recover.apply(Future.scala:324) [scala-library-2.11.6.jar:na]
at scala.concurrent.Future$$anonfun$recover.apply(Future.scala:324) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) [scala-library-2.11.6.jar:na]
at play.api.libs.iteratee.Execution$trampoline$.executeScheduled(Execution.scala:109) [play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:71) [play-iteratees_2.11-2.4.4.jar:2.4.4]
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) [scala-library-2.11.6.jar:na]
at scala.concurrent.Promise$class.complete(Promise.scala:55) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23) [scala-library-2.11.6.jar:na]
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) [akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [akka-actor_2.11-2.3.13.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.6.jar:na]
Caused by: java.lang.NullPointerException: null
at com.avaje.ebean.Model$Find.query(Model.java:547) ~[avaje-ebeanorm-4.6.2.jar:na]
at com.avaje.ebean.Model$Find.where(Model.java:741) ~[avaje-ebeanorm-4.6.2.jar:na]
at repositories.AuthRepository.getAuthorizationQuery(AuthRepository.java:12) ~[classes/:na]
at interceptors.AuthInterceptor.call(AuthInterceptor.java:31) ~[classes/:na]
at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:94) ~[play_2.11-2.4.4.jar:2.4.4]
at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:94) ~[play_2.11-2.4.4.jar:2.4.4]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
at play.core.j.HttpExecutionContext$$anon.run(HttpExecutionContext.scala:40) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) [play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32) ~[play_2.11-2.4.4.jar:2.4.4]
at scala.concurrent.impl.Future$.apply(Future.scala:31) ~[scala-library-2.11.6.jar:na]
at scala.concurrent.Future$.apply(Future.scala:492) ~[scala-library-2.11.6.jar:na]
at play.core.j.JavaAction.apply(JavaAction.scala:94) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply$$anonfun$apply.apply(Action.scala:105) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply$$anonfun$apply.apply(Action.scala:105) ~[play_2.11-2.4.4.jar:2.4.4]
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply.apply(Action.scala:104) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply$$anonfun$apply.apply(Action.scala:103) ~[play_2.11-2.4.4.jar:2.4.4]
at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na]
at play.api.mvc.Action$$anonfun$apply.apply(Action.scala:103) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.mvc.Action$$anonfun$apply.apply(Action.scala:96) ~[play_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$mapM.apply(Iteratee.scala:524) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$mapM.apply(Iteratee.scala:524) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM.apply(Iteratee.scala:560) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM.apply(Iteratee.scala:560) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$$anonfun$apply.apply(Iteratee.scala:536) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$$anonfun$apply.apply(Iteratee.scala:536) ~[play-iteratees_2.11-2.4.4.jar:2.4.4]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
... 6 common frames omitted
我认为您需要使用 com.avaje.ebean.Model.Find 而不是 Model.Finder class。
public static final Find<Long,ClientAuthorization> find = new Find<Long,ClientAuthorization>(){};
或者,您可以使用 play.db.ebean。Model.Finder
public static Finder<Long,ClientAuthorization> find = new Finder<Long,ClientAuthorization>( Long.class, ClientAuthorization.class );
我没有测试过,请检查并告诉我。请 post 异常跟踪以便更好地理解。
略微查看源代码表明,在您正在为其构建 find
对象的同一个 class 中拥有一个静态初始化的 find
对象可能不是一个好主意。我会:
- 首先从模型中完全删除此变量 class 并在其他地方创建该字段。
- 或者(如果你必须在那里)在第一次请求对象时延迟初始化它。
前段时间我遇到了一个非常令人难以置信的问题,静态字段引用包含 class 类型并产生意外行为。
万一有人遇到类似问题,配置应该仔细检查。默认的 Model 超类不关心它。有关 aplication.conf
和 orm.xml
的详细信息,请参见此处:
在创建静态 Finder 时指定服务器名称对我有用
Finder<String, Site> find = new Finder<String, Site>([servername], Site.class);