Playframework: [RuntimeException: java.lang.reflect.InvocationTargetException] [英] Playframework: [RuntimeException: java.lang.reflect.InvocationTargetException]

查看:26
本文介绍了Playframework: [RuntimeException: java.lang.reflect.InvocationTargetException]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试基于 Zentask 示例创建一个简单的登录 --zentask- playframework,但是当我单击调用 Application.authenticate 操作的登录按钮时,它会给出运行时异常.我已经用 -- error 标记了该行

I'm trying to create a simple login based on the Zentask sample --zentask - playframework, however when I click the login button which calls the Application.authenticate actions, it gives runtime exception. I have marked the line with -- error

[RuntimeException: java.lang.reflect.InvocationTargetException]

应用程序.java

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()
            );
        }
    }
}

我知道它与登录类中的验证函数有关,因为当我在验证函数中删除对 User.authenticate 的调用时,它可以正常工作.但我无法弄清楚.

I understand it has something to do with the validate function in Login Class, because when I remove the call to User.authenticate in the validate function it works without error. But I am unable to figure it out.

用户类为 -

@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 类 -

and the AccountDetails Class -

@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();
    }

}

推荐答案

我必须假设很多,但如果这就是您的堆栈跟踪的样子:

I have to assume a lot but if this is what your stacktrace looked like:

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.

then the cause of the problem is actually hinted at by the NPE in your User class. If you enter bogus credentials, your finder will not find anything and return null in AccountDetails.authenticate().

因此,在下面的方法中,您不检查 null 并尝试获取导致 NPE 的 userId:

So in the method below you do not check for null and try and get the userId, which causes the NPE:

public static User authenticate(String email, String password) {
  String tempId = AccountDetails.authenticate(email, password).userId;

  return find.ref(tempId);
}

如果您只是正确检查 null,您将获得所需的功能:

If you just check for null properly you will get the desired functionality:

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;
}

这篇关于Playframework: [RuntimeException: java.lang.reflect.InvocationTargetException]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆