来自Form类的方法形式(Class< T>)在Play中被弃用!骨架 [英] The method form(Class<T>) from Form class is deprecated in Play! Framework

查看:149
本文介绍了来自Form类的方法形式(Class< T>)在Play中被弃用!骨架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

首先,玩!强制我使用并注入FormFactory(在 https://www.playframework中进行了解释。 com / documentation / 2.5.0 / JavaForms )。

但是为了实例化这个FormFactory,我必须为它的构造函数传递3个参数,即MessagesApi,格式器和验证器。包括,我不得不实例化Validator接口,我不确定这是否是正确的方法。



为了使它更容易,我将它分离另一个类:

 包控制器; 

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;
导入play.i18n.MessagesApi;

类Validador实现Validator {
$ b $ @Override
public ExecutableValidator forExecutables(){
// TODO自动生成的方法存根
返回空值;

$ b @Override
public BeanDescriptor getConstraintsForClass(Class <?> arg0){
// TODO自动生成的方法存根
返回null;
}

@Override
public< T> T unwrap(Class< T> arg0){
// TODO自动生成的方法存根
返回null;
}

@Override
public< T>设置< ConstraintViolation< T>> validate(T arg0,Class<> ... arg1){
// TODO自动生成的方法存根
返回null;
}

@Override
public< T>设置< ConstraintViolation< T>> validateProperty(T arg0,String arg1,Class<> ... arg2){
// TODO自动生成的方法存根
返回null;
}

@Override
public< T>设置< ConstraintViolation< T>> validateValue(Class arg0,String arg1,Object arg2,Class <?> ... arg3){
// TODO自动生成的方法存根
返回null;
}
}

公共类FormCreator {

MessagesApi msgAPI;
格式化器formatador;
Validador validador;
FormFactory工厂;

public FormCreator(){
msgAPI = new MessagesApi(null);
formatador =新格式器(msgAPI);
validador = new Validador();
factory =新的FormFactory(msgAPI,formatador,validador);


$ b $ // getters e setters
public MessageApi getmsgAPI(){
return msgAPI;
}
public void setmsgAPI(MessagesApi msgAPI){
this.msgAPI = msgAPI;
}
public格式化程序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;




$ b $ p
$ b

在我的控制器中,我必须把这样的东西:

  @Inject 
FormCreator formCreator = new FormCreator();

虽然我花了几个小时才发现这个问题,但这个问题已经解决了。



另一个是,无论我做什么,bindFromRequest()方法总是返回null,不是因为eclipse和其他任何东西,而是因为我从该工厂创建的表单调用它。



例子:

  //永远不会工作
formCreator 。.getFactory()形式(Diretor.class).bindFromRequest();

//正常工作,但不推荐
Form.form(Diretor.class).bindFromRequest();

使用最新的方法代替这个弃用的方法?

在此先感谢。

解决方案

Play 2.5.x文档声明:


要包装一个类,你必须在你的Controller中注入一个play.data.FormFactory,然后你可以创建这个表单:



Form userForm = formFactory.form(User.class);

所以第一步是注入 FormFactory 到您的控制器中。你这样做:

  package controllers; 

导入播放。*;
import play.mvc。*;

public class Application extends Controller {

@Inject FormFactory formFactory;

...
}

然后在行动中你处理表单提交请求,你可以像这样使用 FormFactory

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


I spent a lot of time trying so solve this problem, and searching the method to substitute this one, without success.

First, Play! obligates me to use and inject the FormFactory (that is explained in https://www.playframework.com/documentation/2.5.0/JavaForms).

But just for instantiate this FormFactory I had to pass 3 parameters for it's constructor, that is MessagesApi, Formatters and Validator. Including, I had to instantiate the Validator interface, and I'm no sure that is the right way to do it.

To make it more easy, I separated it in another class:

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

And in my controller I have to put something like this:

@Inject
FormCreator formCreator = new FormCreator();

althrough that I spent some hours to discover this, this question was solved.

Another one is, whatever I do, the method bindFromRequest() always returns null, and is no because the eclipse, and anything else, it's because I call it from a form created by this factory.

Example:

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

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

What is the newest method to use instead this deprecated method?

Thanks in advance.

解决方案

The Play 2.5.x documentation states it:

To wrap a class you have to inject a play.data.FormFactory into your Controller which then allows you to create the form:

Form userForm = formFactory.form(User.class);

So the first step is to inject the FormFactory into your controller. You do it like this:

package controllers;

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

public class Application extends Controller {

    @Inject FormFactory formFactory;

    ...
}

Then in the action where you handle the form-submission request you can use the FormFactory like this:

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

这篇关于来自Form类的方法形式(Class&lt; T&gt;)在Play中被弃用!骨架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆