![](/img/trans.png)
[英]java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
[英]Playframework: [RuntimeException: java.lang.reflect.InvocationTargetException]
我試圖基於Zentask示例創建一個簡單的登錄-zentask-playframework ,但是當我單擊調用Application.authenticate操作的登錄按鈕時,它會給出運行時異常。 我用-錯誤標記了這一行
[RuntimeException: java.lang.reflect.InvocationTargetException]
應用程序
public class Application extends Controller {
.........
public static class Login
{
public String email;
public String password;
public String validate()
{
if (User.authenticate(email, password) == null) {
return "Invalid user or password";
}
return null;
}
}
public static Result authenticate()
{
Form<Login> loginForm = form(Login.class).bindFromRequest(); //--- error
if(loginForm.hasErrors()) {
return badRequest(login.render(loginForm));
} else {
session("email", loginForm.get().email);
return redirect(
routes.Application.index()
);
}
}
}
我知道它與Login Class中的validate函數有關,因為當我刪除validate函數中對User.authenticate的調用時,它的工作沒有錯誤。 但我無法弄清楚。
用戶類為-
@Entity
public class User extends Model
{
@Id
@Constraints.Required
@Formats.NonEmpty
public String userId;
@OneToOne(cascade=CascadeType.PERSIST)
AccountDetails accDetails;
public static Model.Finder<String,User> find = new Model.Finder<String,User>(String.class, User.class);
// Authenticate the user details
public static User authenticate(String email, String password)
{
String tempId = AccountDetails.authenticate(email, password).userId;
return find.ref(tempId);
}
.. . . . . . .
}
和AccountDetails類-
@Entity
public class AccountDetails extends Model
{
@Id
String userId;
@Constraints.Required
String emailId;
@Constraints.Required
String password;
public static Model.Finder<String,AccountDetails> find =
new Model.Finder<String,AccountDetails>(String.class, AccountDetails.class);
public static AccountDetails authenticate(String email, String password)
{
return find.where()
.eq("email", email)
.eq("password", password)
.findUnique();
}
}
我必須假設很多,但是如果這是您的stacktrace的樣子:
play.api.Application$$anon$1: Execution exception[[RuntimeException: java.lang.reflect.InvocationTargetException]]
at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10.jar:2.2.3]
at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10.jar:2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10.jar:2.2.3]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10.jar:2.2.3]
at scala.Option.map(Option.scala:145) [scala-library.jar:na]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:264) [play_2.10.jar:2.2.3]
...
Caused by: java.lang.NullPointerException: null
at models.User.authenticate(User.java:26) ~[na:na]
at controllers.Application$Login.validate(Application.java:50) ~[na:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_05]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_05]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_05]
at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_05]
那么問題的原因實際上是由您的User類中的NPE提示的。 如果輸入偽造的憑據,則查找程序將找不到任何內容,並在AccountDetails.authenticate()中返回null。
因此,在下面的方法中,您無需檢查null並嘗試獲取userId,這會導致NPE:
public static User authenticate(String email, String password) {
String tempId = AccountDetails.authenticate(email, password).userId;
return find.ref(tempId);
}
如果您只是正確檢查null,則將獲得所需的功能:
public static User authenticate(String email, String password) {
User user = null;
AccountDetails accountDetails = AccountDetails.authenticate(email, password);
if (accountDetails != null) {
user = find.ref(accountDetails.userId);
}
return user;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.