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;
      }

}

タスク 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に取り組んでいるので(プロジェクトはインポート前にEclipse化されています)、taskFormを解決できないことがわかり、「render()、redirect()、bindFromRequest()」などのすべてのplay 2コマンドに下線が引かれ、作成するように求められますそのための方法。コンパイル エラーを解決する方法と、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

Try putting these import statements on Application.java [original/ not updated one]:

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

私もこのエラーを受け取り、ネット全体を調べましたが、エラーはそこに残りました。私が得たクイックフィックスソリューションの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

あなたは実際にいくつかの間違いを犯したと思います:

  1. taskFormコントローラーで宣言されているため、 Task クラスで解決できません
  2. アプリを実行すると、ビューは sbt (つまり、play コンソール) によってコンパイルされます。したがって、renderコンパイルが正常に行われた後にメソッドが使用可能になります (Eclipse で更新を行う必要があります)。
  3. の同じ問題redirect
  4. bindFromRequest()解決できないため、利用taskFormできません (cf 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

変数 static Form taskForm のスコープに問題がありました。デフォルトの範囲でした。public static に変更すると、エラーが発生しました。

タスクリストの代わりに経費管理システムを試してみました。概念的には非常に似ていました-経費のリスト、経費の追加など。デフォルトのH2の代わりにSQLite3データベースを使用しました。

これらは、私がしなければならなかった他の変更の一部でした-

# 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 クラスに基づいて自動クエリを実行してテーブルを作成しようとしていました。このプラグインを無効にすると、続行できました。

もう 1 つ注意すべき点は、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 依存関係を追加しませんでした。これは、jar ファイルを lib/ ディレクトリに追加する場合、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 に答える