2013-10-02 8 views
8

मैं ज़ेंटस्क नमूना - zentask - playframework पर आधारित एक साधारण लॉगिन बनाने की कोशिश कर रहा हूं, हालांकि जब मैं लॉगिन बटन पर क्लिक करता हूं जो एप्लिकेशन को कॉल करता है। प्रमाणीकरण क्रियाएं, यह रनटाइम अपवाद देता है। त्रुटि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() 
      ); 
     } 
    } 
} 

मैं समझता हूँ कि यह, लॉग इन क्लास में सत्यापित करें समारोह के साथ क्या करना है क्योंकि जब मैं उपयोगकर्ता का कॉल निकालना कुछ है - मैं के साथ लाइन में चिह्नित किया है। वैध कार्य में प्रमाणित करें यह त्रुटि के बिना काम करता है। लेकिन मैं इसे समझने में असमर्थ हूं।

उपयोगकर्ता वर्ग के रूप में है -

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

} 

किसी भी मदद अत्यधिक सराहना की जाएगी।

Thanx बहुत कुछ।

+0

कोई आयात घोषणा नहीं, कोई अपवाद स्टैक ट्रेस, खंडित कोड नहीं। इस तरह के सवाल का जवाब देने के लिए काफी कट्टरपंथी है, सिवाय इसके कि आप पहले से ही इस तरह की समस्या का सामना कर रहे हैं। –

उत्तर

4

मैं आवंटित ग्रहण करने के लिए है, लेकिन अगर यह है कि आपके स्टैकट्रेस की तरह दिखाई देता है:

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] 

तो समस्या का कारण वास्तव में पर एनपीई से अपने प्रयोक्ता कक्षा में संकेत दिया है। यदि आप फर्जी प्रमाण-पत्र दर्ज करते हैं, तो आपके खोजकर्ता को कुछ भी नहीं मिलेगा और AccountDetails.authenticate() में शून्य वापस आ जाएगा।

तो आप नीचे दी गई विधि अशक्त के लिए जाँच नहीं है और कोशिश करते हैं और userId, जो एनपीई का कारण बनता है मिलती है:

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