Dynamic Binding Using Bean from Arraylist

Hi There,

I am trying to build a dynamic form builder.


My Field Wrapper Class is

[i]
public class FormField {
public enum TYPES {
DATE, TEXT, MEMO, COMBO, CHECKBOX
}

private String name;
private String id;
private Object value;
private boolean booleanValue;
private TYPES type;



public boolean isBooleanValue() {
    return booleanValue;
}

public void setBooleanValue(boolean booleanValue) {
    this.booleanValue = booleanValue;
}

public FormField(String name, String id, Object value, TYPES type) {
    super();
    this.name = name;
    this.id = id;
    this.value = value;
    this.type = type;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public Object getValue() {
    return value;
}

public void setValue(Object value) {
    this.value = value;
}

public TYPES getType() {
    return type;
}

public void setType(TYPES type) {
    this.type = type;
}

}
[/i]



Then I Initiliase the fields in my DataSource Bean

[i]
public class MyDynamicDataSourceBean{

private List<FormField> formFields;

public List<FormField> getFormFields() {
    return formFields;
}

public void setFormFields(List<FormField> formFields) {
    this.formFields = formFields;
}

public MyDynamicDataSourceBean() {

//Its hardcoded for now, but intention is to get the dynamic from external source and fill the metadata for fields
FormField nameField = new FormField(“Employee Name”, “employeeName”, null, FormField.TYPES.TEXT);
FormField departmentField = new FormField(“Employee Department”, “employeeDept”, null, FormField.TYPES.COMBO);
FormField cityField = new FormField(“City”, “city”, null, FormField.TYPES.TEXT);
FormField dateOfBirthField = new FormField(“Employee DOB”, “employeeDOB”, null, FormField.TYPES.DATE);
FormField permanentEmpField = new FormField(“Is Permanent Employee?”, “permanentEmp”, null,
FormField.TYPES.TEXT);
formFields = new ArrayList();
formFields.add(nameField);
formFields.add(departmentField);
formFields.add(cityField);
formFields.add(dateOfBirthField);
formFields.add(permanentEmpField);
}
[/i]


Then Use this in my View Impl

[i]
MultiColumnFormLayout multiColumnFormLayout = new MultiColumnFormLayout(2,
myDynamicDataSourceBean.getFormFields().size());
int index = 0;
for (FormField formField : datasourceBean.getFormFields()) {
if (FormField.TYPES.TEXT.equals(formField.getType())) {
TextField textField = new TextField(caption);
textField.setImmediate(true);


fieldGroup.bind(textField, “formFields[” + index + “]
.value”);


textField.setValidationVisible(false);
textField.setNullRepresentation(TEXT_NULL_REPRESENTATION);
multiColumnFormLayout.addComponent(textField);
} else if (FormField.TYPES.COMBO.equals(formField.getType())) {

} else if (FormField.TYPES.DATE.equals(formField.getType())) {

} else if (FormField.TYPES.MEMO.equals(formField.getType())) {

        } else if (FormField.TYPES.CHECKBOX.equals(formField.getType())) {
            ...........
        }
        index++;
    }

[/i]

But when I run the form I get the following exception:


java.lang.IllegalArgumentException: Bean property 'formFields[0]
’ not found

at com.vaadin.data.util.NestedMethodProperty.initialize(NestedMethodProperty.java:149)
at com.vaadin.data.util.NestedMethodProperty.(NestedMethodProperty.java:95)
at com.vaadin.data.util.BeanItem.addNestedProperty(BeanItem.java:251)
at com.vaadin.data.fieldgroup.BeanFieldGroup.ensureNestedPropertyAdded(BeanFieldGroup.java:146)
at com.vaadin.data.fieldgroup.BeanFieldGroup.bind(BeanFieldGroup.java:153)
at com.vaadin.data.fieldgroup.FieldGroup.setItemDataSource(FieldGroup.java:105)
at com.vaadin.data.fieldgroup.BeanFieldGroup.setItemDataSource(BeanFieldGroup.java:125)
at com.vaadin.data.fieldgroup.BeanFieldGroup.setItemDataSource(BeanFieldGroup.java:118)
at com.hrss.app.web.form.demo.view.BasicFormImpl.setDatasource(BasicFormImpl.java:321)
at com.hrss.app.web.view.letter.LetterRequestView.showForm(LetterRequestView.java:170)
at com.hrss.app.web.view.letter.LetterRequestView.access$0(LetterRequestView.java:162)
at com.hrss.app.web.view.letter.LetterRequestView$1.layoutClick(LetterRequestView.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:198)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161)
at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1008)
at com.vaadin.ui.AbstractOrderedLayout.access$000(AbstractOrderedLayout.java:42)
at com.vaadin.ui.AbstractOrderedLayout$1.layoutClick(AbstractOrderedLayout.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:408)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:79)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1409)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:364)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1526)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1482)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.NoSuchMethodException: com.mypackage.MyDynamicDataSourceBean.areFormFields[0]
()

at java.lang.Class.getMethod(Class.java:1786)
at com.vaadin.data.util.MethodProperty.initGetterMethod(MethodProperty.java:545)
at com.vaadin.data.util.NestedMethodProperty.initialize(NestedMethodProperty.java:144)
… 55 more

Any one has tried this?

Hi, I just got into this situation where we plan to replace bpm engine with something like “UI driven by backend service layer”. I am actually exploring this area in the moment, but found some few articles on this:
Old, but I think still relevant
http://www.aceevo.com/2011/04/30/easy-form-creation-with-fluent-pattern-in-vaadin/

https://vaadin.com/vaadin-documentation-portlet/framework/datamodel/datamodel-itembinding.html

I would like to defacto develop kind of framework where service layer power up the UI (based on some templates, etc.)

Did you progress on your stuff?

Regards,

Ladislav

Additionally there is this stuff available:
https://vaadin.com/wiki/-/wiki/Main/Auto+generating+a+form+based+on+a+bean+-+Vaadin+6+style+Form