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