来自Form类的方法形式(Class< T>)在Play中被弃用!骨架 [英] 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,格式器和验证器。包括,我不得不实例化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< T>)在Play中被弃用!骨架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!