Ich habe viel Zeit damit verbracht, zu versuchen, dieses Problem zu lösen, und die Methode zu suchen, um diese zu ersetzen, ohne Erfolg.Das Methodenformular (Klasse <T>) aus der Form-Klasse ist in Play nicht mehr gültig! Framework
Zuerst, Spiel! verpflichtet mich, die FormFactory zu verwenden und zu injizieren (das wird in https://www.playframework.com/documentation/2.5.0/JavaForms erklärt).
Aber nur für die Instanziierung dieser FormFactory musste ich 3 Parameter für seinen Konstruktor übergeben, das ist MessagesApi, Formatierer und Validator. Außerdem musste ich die Validator-Schnittstelle instanziieren, und ich bin mir nicht sicher, ob dies der richtige Weg ist.
Um es einfach zu machen, ich kann es in einer anderen Klasse getrennt:
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;
}
}
Und in meinem Controller habe ich etwas so:
@Inject
FormCreator formCreator = new FormCreator();
althrough, dass ich ein paar Stunden damit verbracht, zu entdecke das, diese Frage wurde gelöst.
Eine andere ist, was auch immer ich tue, die Methode bindFromRequest() gibt immer null zurück, und ist nein, weil die Eklipse und alles andere, weil ich es aus einem Formular von dieser Fabrik aufgerufen habe.
Beispiel:
// never works
formCreator.getFactory().form(Diretor.class).bindFromRequest();
// works fine, but is deprecated
Form.form(Diretor.class).bindFromRequest();
Was ist die neueste Methode anstelle diese veraltete Methode zu verwenden?
Vielen Dank im Voraus.
Danke Jungs, ich habe noch nichts über Injektionen gelesen, Ihr Beispiel hat mir geholfen. – tomurlh
Gut zu helfen. Bitte überlegen Sie, die Antwort zu akzeptieren, wenn es Ihr Problem gelöst hat. – Anton
Warum funktioniert es nicht, wenn ich es außerhalb der Aktion als eine Member-Variable der Klasse selbst deklariere? – user2601010