2013-10-02 9 views
8

私はZentaskサンプルに基づいて、簡単なログインを作成しようとしている - zentask - playframework、しかし私はApplication.authenticateアクションを呼び出してログインボタンをクリックしたとき、それは実行時例外が発生します。エラーPlayframework:[のRuntimeException:にjava.lang.reflect.InvocationTargetException]

[RuntimeException: java.lang.reflect.InvocationTargetException] 

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

私はそれが私がユーザーへの呼び出しを削除するとするので、ログインクラスでの検証機能とは何かを持って理解して - 私は、行をマークしています。 validate関数で認証します。これはエラーなく動作します。しかし、私はそれを理解することができません。すべてのヘルプは高く評価されるだろう

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

} 

-

@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クラス - として

ユーザクラスです。

Thanx a lot。

+0

インポートの宣言な​​し、例外スタックトレース、フラグメントコードなし。あなたはすでにそのような問題に取り組んでいることを除いて、そのような質問に答えるのはかなりハードコアです。 –

答えて

4

私が割り当てると仮定しなければならないが、これはあなたのスタックトレースは次のように見えたものである場合:その問題の原因は、実際に自分のUserクラスにNPEでほのめかしている

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] 

。 偽の認証情報を入力すると、Finderは何も見つからず、AccountDetails.authenticate()でnullを返します。

ですから、以下の方法でnullをチェックしてみてくださいとNPEの原因はuserId、取得しない:

:あなただけのnullをチェックする場合は、適切にあなたが希望する機能を取得します

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

    return find.ref(tempId); 
} 

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; 
} 
関連する問題