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.
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
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
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