使用java反射动态创建JSF表单

Joh*_*ami 5 java reflection jsf hibernate crud

我正在尝试创建一个简单的 CRUD 表单,以使用 Hibernate 将数据插入数据库,而不知道对象类型是什么。最终目标是数据库中的每个表只有一个插入表单。到目前为止,我获取了当前对象具有的方法,检查它是否具有任何设置方法,并为每个具有设置的字段创建一个文本输入。

UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
HtmlPanelGrid hpg = (HtmlPanelGrid) viewRoot.findComponent("panel");
    for (Method method : declaredFields) {
        String name = method.getName();

        if (name.contains("set")) {
            HtmlOutputText hot = new HtmlOutputText();
            HtmlInputText hit = new HtmlInputText();
            hot.setValue(name.substring(3));
            try {
                hit.setValue(newObject.getClass().getMethod(name, String.class));
            } catch (Exception ex) {
                Logger.getLogger(ReflectController.class.getName()).log(Level.SEVERE, null, ex);
            }
            hpg.getChildren().add(hot);
            hpg.getChildren().add(hit);
        }

    }
Run Code Online (Sandbox Code Playgroud)

这里的newObject是稍后将通过hibernate插入数据库的对象。我的问题是这样的:

如何将该对象中的某个字段分配给当前正在创建的文本输入。到目前为止,如果我像上面那样将方法放入值中,它只会打印出该输入的值属性中的方法。我想要的是,当提交此表单时,将该文本框中的值分配给具有该名称的属性。

Ste*_*son 2

我可以给你一个部分答案 - 你需要动态创建一个 ValueExpression

    Application app = FacesContext.getCurrentInstance().getApplication();
    hit.setValueExpression("value", app.getExpressionFactory().createValueExpression(FacesContext.getCurrentInstance().getELContext(), "#{bean.item}", Item.class));
Run Code Online (Sandbox Code Playgroud)

困难的部分是创建实际映射到对象值中的字段的 valueExpression。这需要更多的思考,但您肯定需要动态 valueExpression。正如所写的,这将导致执行 bean 的 setItem(); 方法,其参数类型为 Item。您将需要一些更复杂的东西。