2016-03-19 9 views
6

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.

Antwort

12

Die Play 2.5.x Dokumentation heißt es:

Um eine Klasse zu umhüllen, müssen Sie eine play.data.FormFactory in Ihren Controller injizieren, die Ihnen dann ermöglicht, das Formular zu erstellen:

Formular userForm = formFactory.form (User.class);

Also der erste Schritt ist, die FormFactory in Ihren Controller zu injizieren. Sie tun es wie folgt aus:

package controllers; 

import play.*; 
import play.mvc.*; 

public class Application extends Controller { 

    @Inject FormFactory formFactory; 

    ... 
} 

Dann in der Aktion, wo Sie das Formular-Vorlage Anfrage bearbeiten können Sie die FormFactory wie folgt verwenden:

public Result handleFormSubmission() { 
    formFactory.form(Director.class).bindFromRequest(); 
} 
+1

Danke Jungs, ich habe noch nichts über Injektionen gelesen, Ihr Beispiel hat mir geholfen. – tomurlh

+0

Gut zu helfen. Bitte überlegen Sie, die Antwort zu akzeptieren, wenn es Ihr Problem gelöst hat. – Anton

+0

Warum funktioniert es nicht, wenn ich es außerhalb der Aktion als eine Member-Variable der Klasse selbst deklariere? – user2601010

4

Sie müssen nicht die FormFactory initialisieren, gehen Sie folgendermaßen vor:

@Inject FormFactory formFactory; 

und dann in Ihrer Aktion, rufen:

formFactory.form(Director.class).bindFromRequest(); 
+0

Danke für die Hilfe, Alter. Jetzt habe ich keine langweiligen Warnungen. – tomurlh

0

Leider ist die oben genannte Antwort nicht für mich arbeiten . Hier ist, was ich herausgefunden habe und es funktioniert für mein Projekt.

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; 
    } 
} 
1
public class UserController extends Controller { 

@Inject 
FormFactory formFactory; 

public Result loginProcess(){ 

    Form<LoginForm> loginForm = formFactory.form(LoginForm.class).bindFromRequest(); 

    ... 
    } 
} 

Sie nicht dort, dass die Login-Konstruktor benötigen ..siehe mein Beispiel