Play类中的方法表单(Class )在Play中已弃用! 骨架

我花了很多时间尝试解决这个问题,并搜索方法来替换这个,但没有成功。

首先,玩! 我有义务使用并注入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 unwrap(Class arg0) { // TODO Auto-generated method stub return null; } @Override public  Set<ConstraintViolation> validate(T arg0, Class... arg1) { // TODO Auto-generated method stub return null; } @Override public  Set<ConstraintViolation> validateProperty(T arg0, String arg1, Class... arg2) { // TODO Auto-generated method stub return null; } @Override public  Set<ConstraintViolation> validateValue(Class 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和其他任何东西,因为我是从这个工厂创建的表单中调用它。

例:

 // 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 = 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 loginForm; @Inject public Login(FormFactory formFactory) { this.loginForm = formFactory.form(User.class); } public Result list() { return TODO; } }