我正在尝试关注Play2.0 JavaToDO教程,出于某种原因,它只是不想工作。已经查看了stackoverflow和其他在线资源,但没有找到答案,这让我发疯。
Application.java的附加代码
package controllers;
import models.Task;
import play.data.Form;
import play.mvc.Controller;
import play.mvc.Result;
public class Application extends Controller {
static Form<Task> taskForm = form(Task.class);
public static Result index() {
return redirect(routes.Application.tasks());
}
public static Result tasks() {
return ok(
views.html.index.render(Task.all(), taskForm));
}
public static Result newTask() {
return TODO;
}
public static Result deleteTask(Long id) {
return TODO;
}
}
Task java的附加代码
package models;
import java.util.List;
import javax.persistence.Entity;
import play.data.Form;
import play.data.validation.Constraints.Required;
import play.db.ebean.Model.Finder;
import play.mvc.Result;
import controllers.routes;
@Entity
public class Task {
public Long id;
@Required
public String label;
// search
public static Finder<Long,Task> find = new Finder(
Long.class, Task.class);
// display tasks
public static List<Task> all() {
return find.all();
}
// create task
public static void create(Task task) {
task.create(task);
}
// delete task
public static void delete(Long id) {
find.ref(id).delete(id);
// find.ref(id).delete();
}
// create new task
public static Result newTask() {
Form<Task> filledForm = taskForm.bindFromRequest();
if(filledForm.hasErrors()) {
return badRequest(
views.html.index.render(Task.all(), filledForm)
);
} else {
Task.create(filledForm.get());
return redirect(routes.Application.tasks());
}
}
}
我在行上的Task.java上遇到编译错误
static Form<Task> taskForm = form(Task.class);
当我正在处理eclipse时(项目在导入之前被遮蔽了),它告诉我taskForm无法解析,它也强调了每个play 2命令,例如“render(),redirect(),bindFromRequest()”要求我为它创建一个方法。任何想法如何解决编译错误以及如何让Eclipse识别play2命令?
修改
更新了Application.java
package controllers;
import models.Task;
import play.data.Form;
import play.mvc.Controller;
import play.mvc.Result;
public class Application extends Controller {
// create new task
public static Result newTask() {
Form<Task> filledForm = form(Task.class).bindFromRequest();
if(filledForm.hasErrors()) {
return badRequest(
views.html.index.render(Task.all(), filledForm)
);
} else {
Task.newTask(filledForm.get());
return redirect(routes.Application.tasks());
}
}
public static Result index() {
return redirect(routes.Application.tasks());
}
public static Result tasks() {
return ok(
views.html.index.render(Task.all(), taskForm));
}
public static Result deleteTask(Long id) {
return TODO;
}
}
更新了task.java
package models;
import java.util.List;
import javax.persistence.Entity;
import play.data.Form;
import play.data.validation.Constraints.Required;
import play.db.ebean.Model;
import play.db.ebean.Model.Finder;
import play.mvc.Result;
import controllers.routes;
@Entity
public class Task extends Model {
public Long id;
@Required
public String label;
// Define a taskForm
static Form<Task> taskForm = form(Task.class);
// search
public static Finder<Long,Task> find = new Finder(
Long.class, Task.class);
// display tasks
public static List<Task> all() {
return find.all();
}
// create new task
public static Result newTask(Task newTask) {
save(task);
}
// delete task
public static void delete(Long id) {
find.ref(id).delete(id);
// find.ref(id).delete();
}
}
答案 0 :(得分:2)
尝试将这些import语句放在Application.java [original / not updated one]上:
import play.data.*;
import static play.data.Form.*;
答案 1 :(得分:1)
我也收到了这个错误并且全部通过网络,但错误仍然存在。 我得到的一个快速解决方案是: 使用
static Form taskForm =Form.form(Task.class); instead of
static Form taskForm=form(Task.class);
你的application.java文件中的
希望这能解决你的问题。
答案 2 :(得分:0)
我认为你实际上犯了一些错误:
taskForm
无法在您的Task类中解析,因为它是在您的控制器中声明的render
方法将可用(您必须在Eclipse上刷新)redirect
bindFromRequest()
无法使用,因为taskForm
无法解析(参见1)。修改强>
我刚看到Task类中有一个newTask()方法,这个方法应该与此类似:
在任务类(which should extends play.db.ebean.Model
)中:
// create new task
public static void newTask(Task newTask) {
save(newTask);
}
在你的控制器中:
// create new task
public static Result newTask() {
Form<Task> filledForm = taskForm.bindFromRequest();
if(filledForm.hasErrors()) {
return badRequest(
views.html.index.render(Task.all(), filledForm)
);
} else {
Task.newTask(filledForm.get());
return redirect(routes.Application.tasks());
}
}
编辑2:
// create new task
public static Result newTask() {
Form<Task> filledForm = form(Task.class).bindFromRequest();
...
}
答案 3 :(得分:0)
我正在学习本教程...
https://github.com/jamesward/play2torial/blob/master/JAVA.md
...并且在使用版本2.0.1或Play时遇到了类似的错误。我正在使用版本2.0.4的相同教程,我没有看到错误。所以请试试Play的最新版本。
答案 4 :(得分:0)
您必须为Eclipse安装Scala插件才能解决此问题 http://scala-ide.org/download/current.html有时需要刷新eclipse项目。
干杯!
答案 5 :(得分:0)
我的变量static Form taskForm的范围有问题;它是默认范围。当我把它改为public static那个错误时。
我尝试了费用管理系统而不是任务列表。从概念上讲它非常相似 - 列出费用,增加费用等。我使用SQLite3数据库而不是默认的H2。
在application.conf文件中 这些是我必须做的其他一些改变 -
# Ebean configuration
# ~~~~~
# You can declare as many Ebean servers as you want.
# By convention, the default server is named `default`
#
ebean.default="models.*" <<<<<<<<---- uncommented this.
# Evolutions
# ~~~~~
# You can disable evolutions if needed
evolutionplugin=disabled <<<<<<<<---- uncommented this.
evolutions插件试图通过运行基于我创建的models.Expense类的自动查询来创建表。在禁用此插件时,我能够继续。
需要注意的另一件事是 - 我必须创建表,方法与定义Expense类完全相同。在Expense类中声明的变量的顺序和数据类型与数据库表相同。
db.default.url="jdbc:sqlite:<absolute path including DB name>"
我想首先检查是否可以列出表中的费用或否。 所以,我从Application.newExpense()函数中注释掉了这些行。
public static Result newExpense() {
Form<Expense> filledForm = Application.expenseForm.bindFromRequest();
if(filledForm.hasErrors()) {
//return badRequest(views.html.index.render(Expense.all(),Application.expenseForm));
return null;
}
else {
Expense.create(filledForm.get());
//return redirect(controllers.routes.Application.expenses());
return null;
}
}
这就是我的index.scala.html的样子 -
@(expenses: List[Expense] , expenseForm: Form[Expense])
@import helper._
@main("Expense Management System") {
<h1>@expenses.size() expense(s)</h1>
<ul>
@for(expense <- expenses) {
<li>
@expense.id
@expense.category
@expense.description
@expense.amount
</li>
}
</ul>
<h2>Add a new expense</h2>
@form(routes.Application.newExpense()) {
@inputText(expenseForm("label"))
<input type="submit" value="Add">
}
}
我没有在Build.scala文件的appDependencies部分添加sqlite3依赖项,因为我读了here,如果我添加,我不必添加数据库依赖项它的jar文件在lib /目录中。
val appDependencies = Seq(
jdbc,
// Add your project dependencies here,
//"sqlite3" % "org.sqlite.JDBC" % "3.6.20",
javaCore,
javaEbean
)