【问题标题】:The method form(Class<T>) from Form class is deprecated in Play! Framework来自 Form 类的方法 form(Class<T>) 在 Play 中已弃用!框架
【发布时间】:2016-07-06 02:52:41
【问题描述】:

我花了很多时间试图解决这个问题,并寻找替代这个的方法,但没有成功。

首先,玩!我有义务使用和注入 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,并且是no,因为eclipse,以及其他任何东西,这是因为我从这个工厂创建的表单中调用它。

例子:

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

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

用什么最新的方法来代替这个不推荐使用的方法?

提前致谢。

【问题讨论】:

    标签: java forms playframework deprecated


    【解决方案1】:

    Play 2.5.x 文档指出:

    要包装一个类,您必须将一个 play.data.FormFactory 注入到您的控制器中,然后您可以创建表单:

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

    【讨论】:

    • 谢谢大家,我还没有读到关于注射的东西,你的例子帮助了我。
    • 很高兴为您提供帮助。如果它确实解决了您的问题,请考虑接受答案。
    • 如果我在动作之外声明它就像类本身的成员变量一样,为什么它不起作用?
    【解决方案2】:

    您不必初始化FormFactory,请尝试以下操作:

    @Inject FormFactory formFactory;
    

    然后在你的行动中,调用:

    formFactory.form(Director.class).bindFromRequest();
    

    【讨论】:

    • 谢谢你的帮助,伙计。现在我没有无聊的警告了。
    【解决方案3】:
    public class UserController extends Controller {
    
    @Inject
    FormFactory formFactory;
    
    public Result loginProcess(){
    
        Form<LoginForm> loginForm = formFactory.form(LoginForm.class).bindFromRequest();
    
        ...
        }
    }
    

    你不需要那个 Login 构造函数 .. 看我的例子

    【讨论】:

      【解决方案4】:

      不幸的是,上述答案对我不起作用。这是我想出的,它适用于我的项目。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        • 2015-08-27
        • 1970-01-01
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多