使用Play Framework中的Form在控制器和视图之间打包问题

时间:2015-02-17 15:27:01

标签: java intellij-idea playframework-2.0

使用表单PlayFramework 2.3.8时遇到问题。在控制器中我使用play.data.Form,但视图请求play.api.data.Form。这导致IntelliJ IDEA 14.0.3给我一个错误,无法运行应用程序。

错误明细:

Error:Play 2 Compiler: 
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output

Error:(59, 50) Play 2 Compiler: 
C:\Users\Jonathan\Documents\WorkspaceIdea\quicket\app\controllers\UsuarioController.java:59: error: incompatible types: Form<Usuario> cannot be converted to List<Usuario>
     return ok(views.html.usuariosHome.render(formularioForm, Comuna.all()));

控制器

package controllers;

import controllers.seguridad.Autorizacion;
import controllers.seguridad.AutorizacionLogica;
import controllers.seguridad.Rol;
import models.Comuna;
import models.Usuario;
import play.data.DynamicForm;
import play.data.Form;
import play.filters.csrf.RequireCSRFCheck;
import play.mvc.Controller;
import play.mvc.Result;
import views.html.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class UsuarioController extends Controller {

    public static Form<Usuario> formularioForm = Form.form(Usuario.class);

    public static Result indexTest() {

        return ok(views.html.usuarios.render(formularioForm, Comuna.all()));
    }
}

查看

@(userForm: Form[Usuario], lstComuna: List[Comuna])
@import helper._
@import java.util._
@main("Usuarios") {

    <div class="container">
        <h1>Usuario</h1>
        @form(routes.UsuarioController.agregarUsuario(),'class -> "form-horizontal") {


            @defining(userForm("id")) { uidField => <input type="hidden" name="@uidField.name" id="@uidField.id" value="@uidField.value"> }
            <div class="panel panel-default">
                <div class="panel-heading">Agregar Usuarios</div>
                <div class="panel-body">
                    <div class="form-group">
                        <label for="rut" class="col-sm-2 control-label">Rut</label>
                        <div class="col-sm-4">
                        @inputText(userForm("rut"), 'id -> "rut", 'name -> "rut",'_showConstraints -> false, 'class ->"form-control")
                        </div>
                        <div class="col-sm-1">
                        @inputText(userForm("dv"), 'id -> "dv", 'name -> "dv",'_showConstraints -> false, 'class ->"form-control")
                        </div>
                    </div>
                    ....
        }
}

提前致谢。

更新

感谢singhakash,我解决了代码中的错误。但无论如何,IDE继续在视图和控制器之间的Form包上设置错误。奇怪的是,它让我现在可以运行该项目。

Controller View

1 个答案:

答案 0 :(得分:1)

从IntelliJ 14.1.6(Scala插件1.5.4)开始,我仍然试图找到解决这个问题的正确方法,但是通过重新配置模块源,我能够减少烦恼。

最直接的方法是将视图源目录标记为已排除(右键单击 - &gt;“将目录标记为” - &gt;已排除),但这样做的缺点是在触发之前不会在自动完成中显示任何新视图SBT编译,因为定义不可用。

我首选的方法是只更改IntelliJ查找源的顺序,以便它首先找到Twirl模板,然后失败,退回到play.api.data版本,这样我就可以获得自动完成但是在SBT重新编译所有内容之后,错误也会消失。

要执行此操作,请打开“模块设置”,选择模块,然后选择“源”选项卡,并从源中删除app文件夹,然后通过选择应用程序文件夹并单击“源”按钮进行读取(没有更直接的方法在UI中对它们进行重新排序):

rearranged sources folder

这当然是超级克鲁迪,特别是因为它似乎对大多数人来说都是开箱即用的!同样,请注意,由于其工作方式,现有视图模板的更改仍需要重新编译才能反映在编辑器中,因为IntelliJ更喜欢SBT编译版本。

我将继续研究这个问题,看看我能否弄清楚我的配置*(以及可能是你的)导致事情无法按预期工作的特殊情况,因为解决这个问题将是正确的解决方案。

*在我的情况下,我已将两个Play 2.3项目导入为一个共同项目的模块,我怀疑这至少是问题的一部分 - 我不清楚为什么会这样