2016-03-19 14 views
6

Tôi đã dành rất nhiều thời gian để giải quyết vấn đề này và tìm kiếm phương pháp để thay thế vấn đề này mà không thành công.Biểu mẫu phương thức (Lớp <T>) từ Lớp biểu mẫu không còn được dùng nữa trong Play! Khung

Đầu tiên, chơi! bắt buộc tôi sử dụng và tiêm FormFactory (được giải thích trong https://www.playframework.com/documentation/2.5.0/JavaForms).

Nhưng chỉ để khởi tạo FormFactory này, tôi phải chuyển 3 tham số cho hàm tạo của nó, đó là MessagesApi, Formatters và Validator. Bao gồm, tôi phải khởi tạo giao diện Validator và tôi không chắc đó là cách đúng đắn để làm điều đó.

Để làm cho nó dễ dàng hơn, tôi tách nó trong lớp khác:

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

Và trong bộ điều khiển của tôi, tôi có phải đặt một cái gì đó như thế này:

@Inject 
FormCreator formCreator = new FormCreator(); 

Althrough mà tôi đã dành một số giờ để khám phá điều này, câu hỏi này đã được giải quyết. Một số khác là, bất cứ điều gì tôi làm, phương thức bindFromRequest() luôn trả về null, và không phải vì nhật thực, và bất cứ thứ gì khác, đó là vì tôi gọi nó từ một biểu mẫu được tạo bởi nhà máy này.

Ví dụ:

// never works 
formCreator.getFactory().form(Diretor.class).bindFromRequest(); 

// works fine, but is deprecated 
Form.form(Diretor.class).bindFromRequest(); 

phương pháp mới nhất để sử dụng thay vì phương pháp NỮA này là gì?

Xin cảm ơn trước.

Trả lời

12

Các tài liệu Chơi 2.5.x khẳng định nó:

Để bọc một lớp, bạn phải tiêm play.data.FormFactory vào Bộ điều khiển của bạn, sau đó cho phép bạn tạo biểu mẫu:

Biểu mẫu userForm = formFactory.form (User.class);

Vì vậy, bước đầu tiên là tiêm FormFactory vào bộ điều khiển của bạn. Bạn làm điều đó như thế này:

package controllers; 

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

public class Application extends Controller { 

    @Inject FormFactory formFactory; 

    ... 
} 

Sau đó, trong hành động mà bạn xử lý các yêu cầu hình thức-trình bạn có thể sử dụng FormFactory như thế này:

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

Cảm ơn các bạn, tôi chưa đọc gì về tiêm chích, ví dụ của bạn đã giúp tôi. – tomurlh

+0

Rất vui được giúp đỡ. Hãy xem xét chấp nhận câu trả lời nếu nó đã giải quyết được vấn đề của bạn. – Anton

+0

Tại sao nó không hoạt động nếu tôi khai báo nó bên ngoài hành động như là một biến thành viên của chính lớp đó? – user2601010

4

bạn không cần phải khởi tạo FormFactory, hãy thử như sau:

@Inject FormFactory formFactory; 

và sau đó trong hành động của bạn, hãy gọi:

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

Cảm ơn bạn đã trợ giúp, anh bạn. Bây giờ tôi không có cảnh báo nhàm chán. – tomurlh

0

Thật không may, câu trả lời ở trên không làm việc cho tôi . Đây là những gì tôi đã đưa ra và nó hoạt động cho dự án của tôi.

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(); 

    ... 
    } 
} 

bạn không cần phải là nhà xây dựng nhập có ..xem ví dụ của tôi

Các vấn đề liên quan