El tutorial de Play 2.0 javaToDo no compila

Estoy tratando de seguir el Play2.0 JavaToDO tutorial y por alguna razón simplemente no quiere funcionar. He buscado a través de stackoverflow y otros recursos en línea, pero no he encontrado una respuesta a esto y me está volviendo loco.

Adjunto código de la Aplicación.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;
      }

}

Adjunto codigo de la Tarea 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());  
      }
    }
}

Recibo un error de compilación en Task.java en la línea static Form<Task> taskForm = form(Task.class);

Como estoy trabajando en eclipse (el proyecto se eclipsa antes de la importación), me dice que taskForm no se puede resolver y también subraya cada comando play 2, por ejemplo, "render(), redirect(), bindFromRequest()" pidiéndome que cree un método para ello. ¿Alguna idea de cómo resolver el error de compilación y también cómo hacer que Eclipse reconozca los comandos play2?

EDIT:

Aplicación actualizada.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 actualizado

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

}

preguntado el 01 de julio de 12 a las 12:07

6 Respuestas

Intente poner estas declaraciones de importación en Application.java [original/no actualizada]:

import play.data.*;
import static play.data.Form.*;

Respondido el 07 de enero de 13 a las 14:01

También recibí este error y revisé toda la red, pero el error permaneció allí. una de las soluciones rápidas que obtuve es: Usar

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

 static Form taskForm=form(Task.class);

en su archivo application.java

Espero que esto resuelve el problema.

contestado el 18 de mayo de 13 a las 14:05

Creo que en realidad has cometido algunos errores:

  1. taskForm no se puede resolver en su clase de tarea ya que está declarado en su controlador
  2. su vista será compilada por sbt (es decir, la consola de juegos) cuando ejecute la aplicación. Entonces el render el método estará disponible después de que la compilación esté bien (tendrá que hacer una actualización en Eclipse)
  3. mismo problema para redirect
  4. bindFromRequest() no está disponible desde taskForm no se puede resolver (cf 1.)

EDIT:

Acabo de ver que hay un método newTask() en la clase Task, y este método debería ser algo similar a esto:

En la clase Tarea (que debe extenderse play.db.ebean.Model):

 // create new task
 public static void newTask(Task newTask) {
    save(newTask);
}

Y en tu controlador:

  // 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());  
    }
}

EDIT 2:

     

// create new task
      public static Result newTask() {
        Form<Task> filledForm = form(Task.class).bindFromRequest();

        ...
    }

Respondido 01 Jul 12, 21:07

Gracias por la pronta respuesta. Si declaro el formulario de tareas en la clase Tarea, todavía tengo problemas con él en views.html.index.render(Task.all(), taskForm)); Entonces, ¿qué estoy haciendo mal aquí? - chsn

Si declara el taskForm en la clase Task, su controlador no lo conoce, de ahí el error. El lugar correcto es en el controlador. Ver mis ediciones. - neverge

gracias por la aclaración. Sin embargo, esto todavía da como resultado un error de compilación en la línea Application.java Form formulario lleno = formulario de tarea.bindFromRequest(); - chsn

lo siento, todavía no hay suerte. Obtiene un error en la línea application.java: views.html.index.render(Task.all(), taskForm));. Adjunté el código actualizado a la publicación inicial. - chsn

tipo clean, compile y entonces eclipsify en su consola de juegos y luego actualice en Eclipse. - neverge

Estoy trabajando a través de este tutorial ...

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

... y recibía un error similar al mencionado anteriormente al trabajar con la versión 2.0.1 o Play. Estoy trabajando en el mismo tutorial con la versión 2.0.4 y NO veo el error. Así que prueba la última versión de Play.

Respondido 12 Feb 13, 14:02

Tienes que instalar el complemento Scala para Eclipse para resolver esto http://scala-ide.org/download/current.html y a veces es necesario actualizar el proyecto eclipse.

¡Aclamaciones!

Respondido el 20 de Septiembre de 13 a las 12:09

Lo que olvidé: haga clic derecho en el proyecto, Configurar> Agregar Scala Nature. - Steffen Friedrich

Tuve un problema con el alcance de la variable Formulario estático taskForm; Estaba en el ámbito predeterminado. Cuando lo cambié a estática pública, ese error desapareció.

Probé un sistema de gestión de gastos en lugar de la lista de tareas. Conceptualmente, era muy similar: enumerar los gastos, agregar gastos, etc. Usé una base de datos SQLite3 en lugar del H2 predeterminado.

en el archivo application.conf Estos fueron algunos de los otros cambios que tuve que hacer:

# 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.

El complemento de evoluciones intentaba crear una tabla ejecutando una consulta automática basada en los modelos. Clase de gastos que había creado. Al deshabilitar este complemento, pude continuar.

Otra cosa a tener en cuenta fue que tenía que crear la tabla exactamente de la misma manera en que se definió mi clase de Gastos. El orden y el tipo de datos de las variables declaradas en la clase Expense era el mismo que el de la tabla de la base de datos.

db.default.url="jdbc:sqlite:<absolute path including DB name>"

Primero quería verificar si puede enumerar los gastos de la tabla o no. Entonces, comenté estas líneas de la función 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;
        }

    }

Así es como se ve mi 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">

    }

}

No agregué la dependencia sqlite3 en la sección appDependencies del archivo Build.scala, como leí aquí que no tengo que agregar la dependencia DB si agrego su archivo jar en el directorio lib/.

 val appDependencies = Seq(
        jdbc,
        // Add your project dependencies here,
        //"sqlite3" % "org.sqlite.JDBC" % "3.6.20",
        javaCore,
        javaEbean
    )

contestado el 23 de mayo de 17 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.