字段值将验证()函数为NULL

时间:2014-06-27 12:16:31

标签: java mongodb validation playframework-2.0

我有一个有趣的问题。我正在尝试在Play框架上实现基本的登录机制。但是,登录表单字段值没有正确地到达UserLogin类的validate()方法,它们在该方法中被视为null,尽管它们在bindFormRequest()方法中成功使用(我通过输出表单知道这个细节)对象到屏幕)。

我错过了一点吗?这是我的代码:

对于Application.java:

package controllers;

import play.*;
import play.mvc.*;

import play.data.DynamicForm;
import play.data.Form;
import static play.data.Form.form;

import views.html.*;

import models.*;

public class Application extends Controller {

public static Result index() {
    return ok(index.render("Your new application is ready."));
}

public static Result login() {
    if ( session().containsKey( "nickName") ) {
        return redirect( routes.Application.mainMenu() );
    }
    else {
        return ok( login.render( form( UserLogin.class) ) );
    }
}

public static Result mainMenu() {
    return ok( mainMenu.render() );
}

public static Result authenticate() {
    Form<UserLogin> loginForm = form( UserLogin.class).bindFromRequest();
    if ( loginForm.hasErrors() ) {
        return badRequest( login.render( loginForm) );
    }
    else {
        return ok( index.render( "S.A.") );
        /*
        session().clear();
        session( "nickName", loginForm.get().nick);
        return redirect( routes.Application.mainMenu() );
        */
    }
}

public static Result registerMenu() {
    if ( session().containsKey( "nickName") ) {
        return redirect( routes.Application.mainMenu() );
    }
    else {
        return ok( registrationForm.render( form( UserRegistration.class) ) );
    }
}

public static Result registerUser() {
    Form<UserRegistration> regForm = form( UserRegistration.class).bindFromRequest();
    if ( regForm.hasErrors() ) {
        return badRequest( registrationForm.render( regForm) );
    }
    else {
        return redirect( routes.Application.login() );
    }
}

public static class UserLogin {
    public String nick;
    public String pwd;

    public String validate() {
        System.out.println( nick + "-" + pwd);
        return null;
        /*
        if ( User.auth( nick, pwd) ) {
            return null;
        }
        else {
            return "Invalid user or password!";
        }
        */
    }
}

public static class UserRegistration {
    public String name;
    public String pwd1;
    public String pwd2;
    public String nickName;

    public String validate() {
        if ( !( pwd1.equals( pwd2) ) ) {
            return "The passwords must match!";
        }
        else {
            if ( User.create( name, nickName, pwd1) != null ) {
                return null;
            }
            else {
                return "The given nick name is already in use, please choose a different one.";
            }
        }
    }
}

}

对于User.java:     包模型;

import java.util.*;
import play.modules.mongodb.jackson.MongoDB;
import net.vz.mongodb.jackson.JacksonDBCollection;
import net.vz.mongodb.jackson.Id;
import net.vz.mongodb.jackson.ObjectId;
import net.vz.mongodb.jackson.WriteResult;
import org.codehaus.jackson.annotate.JsonProperty;

import com.mongodb.BasicDBObject;

import javax.persistence.*;

public class User {

@Id
@ObjectId
public String id;
public String name;
public String nickName;
public String pwd;

private static JacksonDBCollection<User, String> collection = MongoDB.getCollection( "users", User.class, String.class);

public User() {
}

public User( String name, String nickName, String pwd) {
    this.name = name;
    this.nickName = nickName;
    this.pwd = pwd;
}

public static List<User> all() {
    return User.collection.find().toArray();
}

public static String create( User user) {
    BasicDBObject query = new BasicDBObject( "nickName", user.nickName);
    if ( User.collection.find( query).toArray().size() == 0 ) {
        WriteResult<User, String> insertion = User.collection.insert( user);
        return insertion.getSavedId();
    }
    else {
        return null;
    }
}

public static String create( String name, String nickName, String pwd) {
    BasicDBObject query = new BasicDBObject( "nickName", nickName);
    /*
    System.out.println( "Size = " + User.collection.find( query).toArray() );*/
    if ( User.collection.find( query).toArray().size() == 0 ) {
        User user = new User( name, nickName, pwd);
        WriteResult<User, String> insertion = User.collection.insert( user);
        return insertion.getSavedId();
    }
    else {
        return null;
    }
}

public static void delete( String id) {
    User user = User.collection.findOneById( id);
    if ( user != null) {
        User.collection.remove( user);
    }
}

public static boolean auth( String nickName, String pwd) {
    //System.out.println( "NickName = " + nickName + ", Password = " + pwd);
    BasicDBObject query = new BasicDBObject( "nickName", nickName).append( "pwd", pwd);
    //System.out.println( "Size = " + User.collection.find( query).toArray().size() );
    //System.out.println( User.collection.find().toArray() );
    return ( User.collection.find( query).toArray().size() ) == 1;
}

public static int edit( String id, String name, String nickName, String pwd, String pwd2) {
    User user = User.collection.findOneById( id);
    if ( user != null) {
        if ( pwd.equals( pwd2) ) {
            User updated = new User( name, nickName, pwd);
            User.collection.updateById( id, updated);
            return 0;
        }
        else {
            return 1;
        }
    }
    else {
        return 2;
    }
}

public static void removeAll() {
    User.collection.drop();
}

public String toString() {
    return "{\"id\":\"" + id + "\", \"nickName\":\"" + nickName + "\", \"pwd\":\"" + pwd + "\", \"name\":\"" + name + "\"}";
}
}

最后,模板(login.scala.html):

@(form: Form[Application.UserLogin])

<!DOCTYPE html>
<html lang="en">
    <head>
        <link rel="stylesheet" type="text/css" href='@routes.Assets.at( "stylesheets/bootstrap.min.css")' media="screen" />
         <script src='@routes.Assets.at( "javascripts/jquery-1.9.0.min.js")'></script>
         <title>Log In</title>
         <meta http-equiv="Content-Type" value="text/html; charset=utf-8;" />
    </head>
    <body>
        <div class="container">
             @if( form.hasGlobalErrors) {
                <div class="panel panel-danger" style="width: 400px; margin: auto; margin-top: 200px;">
                <div class="panel-heading"><span class="glyphicon glyphicon-log-in"></span>&nbsp;@form.globalError.message</div>
             }
             @if( !( form.hasGlobalErrors) ) {
                <div class="panel panel-primary" style="width: 400px; margin: auto; margin-top: 200px;">
                <div class="panel-heading"><span class="glyphicon glyphicon-log-in"></span>&nbsp;Log In</div>
             }
                <div class="panel-body">
                     @helper.form( routes.Application.authenticate) {
                         <form>
                             <input type="text" name="nick" class="form-control" placeholder="nick_name" /><br />
                             <input type="password" name="pwd" class="form-control" placeholder="Password" /><br />
                             <button type="submit" class="btn btn-primary btn-lg btn-block">Log In</button>
                             <a class="btn btn-link" href="register">Register</a>
                         </form>
                    }
                 </div>
             </div>
        </div>
     </body>
</html>

提前致谢;)

1 个答案:

答案 0 :(得分:0)

我找不到像你浏览该页面那样的确切答案,但我必须在Application.java中实现这样的转变:

public static Result authenticate() {
    Form<UserLogin> loginForm = form( UserLogin.class).bindFromRequest();
    UserLogin op = new UserLogin();
    op.nick = loginForm.field( "nick").value();
    op.pwd = loginForm.field( "pwd").value();
    System.out.println(  );
    if ( op.validate() == null ) {
        session().clear();
        session().put( "nickName", loginForm.field( "nick").value() );
        return redirect( routes.Application.mainMenu() );
    }
    else if ( loginForm.hasErrors() ) {
        return badRequest( login.render( loginForm) );
    }
    else {
        session().clear();
        session().put( "nickName", loginForm.field( "nick").value() );
        return redirect( routes.Application.mainMenu() );
    }
}