2

我正在尝试遵循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 上工作时(该项目在导入之前被 eclipsified),它告诉我 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();
  }

}
4

6 回答 6

2

尝试将这些导入语句放在 Application.java [原始/未更新]上:

import play.data.*;
import static play.data.Form.*;
于 2013-01-07T14:31:29.743 回答
1

我也收到了这个错误并通过了整个网络,但错误仍然存​​在。我得到的快速修复解决方案之一是:使用

static Form taskForm =Form.form(Task.class);      instead of 

 static Form taskForm=form(Task.class);

在您的 application.java 文件中

希望这能解决您的问题。

于 2013-05-18T13:10:26.380 回答
0

我对变量 static Form taskForm 的范围有疑问;它在默认范围内。当我将其更改为公共静态时,该错误发生了。

我尝试了费用管理系统而不是任务列表。从概念上讲,它非常相似——列出费用、添加费用等。我使用 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.

进化插件试图通过运行基于我创建的模型的自动查询来创建一个表。费用类。禁用此插件后,我能够继续。

另一件需要注意的事情是 - 我必须以与定义 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 依赖项,因为我在这里读到如果我在 lib/ 目录中添加它的 jar 文件,我不必添加 DB 依赖项。

 val appDependencies = Seq(
        jdbc,
        // Add your project dependencies here,
        //"sqlite3" % "org.sqlite.JDBC" % "3.6.20",
        javaCore,
        javaEbean
    )
于 2014-08-07T11:32:48.477 回答
0

我认为您实际上犯了一些错误:

  1. taskForm无法在您的 Task 类中解决,因为它是在您的控制器中声明的
  2. 当您运行应用程序时,您的视图将由 sbt(即播放控制台)编译。所以render编译后该方法将可用(您必须在Eclipse上进行刷新)
  3. 同样的问题redirect
  4. bindFromRequest()不可用,因为taskForm无法解决(参见 1。)

编辑:

刚刚看到Task类中有一个newTask()方法,这个方法应该是这样的:

在 Task 类(应该扩展 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();

        ...
    }
于 2012-07-01T13:04:29.417 回答
0

我正在通过本教程工作......

https://github.com/jamesward/play2torial/blob/master/JAVA.md

...并且在使用 2.0.1 版或 Play 时遇到了与上面列出的类似的错误。我正在使用版本 2.0.4 的相同教程,但我没有看到错误。因此,请尝试最新版本的 Play。

于 2013-02-12T14:41:03.303 回答
0

你必须为 Eclipse 安装 Scala 插件来解决这个 http://scala-ide.org/download/current.html有时需要刷新 eclipse 项目。

干杯!

于 2013-09-20T11:23:59.323 回答