[英]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.