Java 嵌套lambda的循环干扰误差
我正在尝试为我的Play Framework应用程序创建注册处理程序,但遇到了一些问题。此代码的目标是获取提交的数据,然后检查用户名或电子邮件是否正在使用。这是使用内置在我的用户类中的方法完成的,用户类是一个模型 注册方法:Java 嵌套lambda的循环干扰误差,java,playframework,Java,Playframework,我正在尝试为我的Play Framework应用程序创建注册处理程序,但遇到了一些问题。此代码的目标是获取提交的数据,然后检查用户名或电子邮件是否正在使用。这是使用内置在我的用户类中的方法完成的,用户类是一个模型 注册方法: public static F.Promise<Result> register() { // Get the POST data and turn it into something we can read from DynamicForm f
public static F.Promise<Result> register() {
// Get the POST data and turn it into something we can read from
DynamicForm form = Form.form().bindFromRequest();
// Get the email, username, and password
String email = form.get("email");
String username = form.get("username");
String password = form.get("password");
return User.findByUsername(username).map(user -> {
// For .map to run we must not have encountered an error, this means
// a user already has this username (otherwise the doc would not exist)
return redirect("/register");
}).recover(userCheckError -> {
// For .recover to run there must have been an error. This will happen
// if a doc was not found with the username (therefore it is not in use)
return User.findByEmail(email).map(option -> { // ERROR START
// We now have an F.Option object. If the email is already taken,
// then the Option is defined (has a value within it), if the email
// is free, the Option will be undefined (no value within it)
if (option.isDefined()) {
return redirect("/register");
} else {
return redirect("/register");
}
}); // ERROR END
});
}
公共静态F.承诺寄存器(){
//获取POST数据并将其转换为我们可以读取的内容
DynamicForm form=form.form().bindFromRequest();
//获取电子邮件、用户名和密码
字符串email=form.get(“email”);
字符串用户名=form.get(“用户名”);
字符串密码=form.get(“密码”);
返回User.findByUsername(用户名).map(用户->{
//要运行.map,我们必须没有遇到错误,这意味着
//用户已具有此用户名(否则该文档将不存在)
返回重定向(“/寄存器”);
}).recover(userCheckError->{
//对于要运行的.recover,必须存在错误。这将发生
//如果找不到用户名为的文档(因此该文档未被使用)
返回User.findByEmail(email).map(选项->{//ERROR START
//我们现在有一个F.选项对象。如果电子邮件已经被接收,
//然后,如果电子邮件
//如果是免费的,则该选项将未定义(其中没有值)
if(option.isDefined()){
返回重定向(“/寄存器”);
}否则{
返回重定向(“/寄存器”);
}
});//错误结束
});
}
findByUsername和findByEmail方法(在用户类中):
public static F.Promise findByUsername(字符串用户名){
返回bucket.get(username.toLowerCase(),User.class);
}
公共静态F.Promise findByEmail(字符串电子邮件){
返回bucket.find(“用户”,“通过电子邮件”,queryhelp.findOne(电子邮件),User.class).map(结果->{
if(result.isEmpty()){
返回F.Option.None();
}否则{
User=result.iterator().next();
返回F.Option.Some(用户);
}
});
}
编辑:我在register方法中添加了注释,并删除了一些不需要的代码。我还标记了错误开始和结束的位置(IntelliJ高亮显示的行。确切的错误是“lambda表达式中的返回类型不正确”。register方法需要返回Promise
,但该代码块返回的是Promise
(通用?)
Javadocs:
你能发布准确的错误消息吗?请剪切并粘贴所有的错误消息。如果你能制作一个完整的示例,这会有所帮助。这里有很多未定义的变量和类。添加了完整的错误消息并澄清了一些内容。我真的不能发布所有的代码,因为它非常适合于播放!框架。我可以但是,为F.Promise和F.Option类提供Javadoc。
public static F.Promise<User> findByUsername(String username) {
return bucket.get(username.toLowerCase(), User.class);
}
public static F.Promise<F.Option<User>> findByEmail(String email) {
return bucket.find("users", "by_email", QueryHelper.findOne(email), User.class).map(result ->{
if (result.isEmpty()) {
return F.Option.None();
} else {
User user = result.iterator().next();
return F.Option.Some(user);
}
});
}