Play 2.0 javaToDo教程无法编译

时间:2012-07-01 11:16:58

标签: java playframework-2.0

我正在尝试关注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();
  }

}

6 个答案:

答案 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)

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

  1. taskForm无法在您的Task类中解析,因为它是在您的控制器中声明的
  2. 当您运行应用程序时,您的视图将由sbt(即播放控制台)编译。因此,编译完成后,render方法将可用(您必须在Eclipse上刷新)
  3. redirect
  4. 的同一问题
  5. bindFromRequest()无法使用,因为taskForm无法解析(参见1)。
  6. 修改

    我刚看到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
    )