簡體   English   中英

方法形式(Class <T> )來自Form類在Play中已棄用! 骨架

[英]The method form(Class<T>) from Form class is deprecated in Play! Framework

我花了很多時間嘗試解決這個問題,並搜索方法來替換這個,但沒有成功。

首先,玩! 我有義務使用和注入FormFactory(在https://www.playframework.com/documentation/2.5.0/JavaForms中有解釋)。

但是為了實例化這個FormFactory,我必須為它的構造函數傳遞3個參數,即MessagesApi,Formatters和Validator。 包括,我必須實例化Validator接口,我不確定這是正確的方法。

為了使它更容易,我在另一個類中將它分開:

    package controllers;

    import java.util.Set;
    import javax.validation.ConstraintViolation;
    import javax.validation.Validator;
    import javax.validation.executable.ExecutableValidator;
    import javax.validation.metadata.BeanDescriptor;
    import play.data.FormFactory;
    import play.data.format.Formatters;
    import play.i18n.MessagesApi;

    class Validador implements Validator {

    @Override
    public ExecutableValidator forExecutables() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public BeanDescriptor getConstraintsForClass(Class<?> arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> Set<ConstraintViolation<T>> validate(T arg0, Class<?>... arg1) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> Set<ConstraintViolation<T>> validateProperty(T arg0, String arg1, Class<?>... arg2) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public <T> Set<ConstraintViolation<T>> validateValue(Class<T> arg0,  String arg1, Object arg2, Class<?>... arg3) {
        // TODO Auto-generated method stub
        return null;
    }
}

public class FormCreator {

    MessagesApi msgAPI;
    Formatters formatador;
    Validador validador;
    FormFactory factory;

    public FormCreator() {
        msgAPI = new MessagesApi(null);
        formatador = new Formatters(msgAPI);
        validador = new Validador();
        factory = new FormFactory(msgAPI, formatador, validador);
    }


    // getters e setters
    public MessagesApi getmsgAPI() {
        return msgAPI;
    }
    public void setmsgAPI(MessagesApi msgAPI) {
        this.msgAPI = msgAPI;
    }
    public Formatters getFormatador() {
        return formatador;
    }
    public void setFormatador(Formatters formatador) {
        this.formatador = formatador;
    }
    public Validador getValidador() {
        return validador;
    }
    public void setValidador(Validador validador) {
        this.validador = validador;
    }
    public FormFactory getFactory() {
        return factory;
    }
    public void setFactory(FormFactory factory) {
        this.factory = factory;
    }
}

在我的控制器中我必須放這樣的東西:

@Inject
FormCreator formCreator = new FormCreator();

通過我花了幾個小時來發現這個,這個問題就解決了。

另外一個是,無論我做什么,方法bindFromRequest()總是返回null,並且因為eclipse和其他任何東西都是no,因為我是從這個工廠創建的表單中調用它。

例:

// never works
formCreator.getFactory().form(Diretor.class).bindFromRequest();

// works fine, but is deprecated
Form.form(Diretor.class).bindFromRequest();

使用這種棄用方法的最新方法是什么?

提前致謝。

Play 2.5.x文檔說明了這一點:

要包裝一個類,你必須將一個play.data.FormFactory注入到Controller中,然后允許你創建表單:

表單userForm = formFactory.form(User.class);

因此,第一步是將FormFactory注入您的控制器。 你這樣做:

package controllers;

import play.*;
import play.mvc.*;

public class Application extends Controller {

    @Inject FormFactory formFactory;

    ...
}

然后在您處理表單提交請求的操作中,您可以使用FormFactory如下所示:

public Result handleFormSubmission() {
    formFactory.form(Director.class).bindFromRequest();
}

您不必初始化FormFactory ,請嘗試以下操作:

@Inject FormFactory formFactory;

然后在你的行動中,致電:

formFactory.form(Director.class).bindFromRequest();
public class UserController extends Controller {

@Inject
FormFactory formFactory;

public Result loginProcess(){

    Form<LoginForm> loginForm = formFactory.form(LoginForm.class).bindFromRequest();

    ...
    }
}

你不需要那個Login構造函數..看看我的例子

不幸的是,上述答案對我不起作用。 這是我提出的,它適用於我的項目。

import play.mvc.*;
import play.*;
import views.html.logins.*;
import models.User;
import play.data.Form;
import play.data.FormFactory;
import javax.inject.Inject;

public class Login extends Controller{
   private static Form<User> loginForm;

   @Inject
   public Login(FormFactory formFactory) {
      this.loginForm =  formFactory.form(User.class);
  }

   public Result list() {
       return TODO;
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM