JSF 2 动态表单和 Bean 验证 JSR 303

2024-01-04

我从带注释的 bean 开始生成一个动态表单。使用 Hibernate Validator 对同一个 bean 进行注释以进行验证。 表单已正确呈现,但提交表单时,验证步骤并未执行。如果我使用 jsf 标记编写相同的表单,则验证可以正常工作。

任何想法?

表单页面:

<body>

    <ui:composition template="/template/basetheme_one_col.xhtml">
        <ui:define name="title">#{__g4cController.entityClassName}</ui:define>

        <ui:define name="main_area">

            <h2>#{__g4cController.entityClassName}</h2>
            <br />
            <div id="briciole_pane">
                <h:form id="briciole_pane_form"  styleClass="form">
                    <h:commandLink action="home" value="Home" />
                    <h:outputText value=" / " />
                    Modifica #{__g4cController.entityClassName}
                </h:form>
            </div>
            <br />


            <h:form id="edit_record"  styleClass="myForm">
                <rich:calendar rendered="false" />
                <h4>Modifica #{__g4cController.entityClassName}</h4>

                <h:messages errorClass="error_msg" layout="list" globalOnly="false" />
                <br />

               <h:panelGrid binding="#{__g4cController.dynamicForm}" />


               <div class="box_bottoni">
                    <div class="box_bottone_azzurro">
                        <h:commandLink action="#{__g4cController.edit}" value="Salva Modifiche">
                            <f:param name="cruddao.objectKey" value="#{g4c:getXmlFromObject(__g4cController.entity.id)}" />
                        </h:commandLink>
                    </div>
                    <h:commandLink action="#{__g4cController.listSetup}" styleClass="link_annulla_rosso"
                                   value="Annulla e torna a lista #{__g4cController.entityClassName}" immediate="true" />
                    <div class="clear"></div>
                </div>


           </h:form>

        </ui:define>
    </ui:composition>
</body>

从 EntityBean 开始生成表单的代码

    public UIComponent getDynamicForm() {
    FacesContext ctx = FacesContext.getCurrentInstance();
    Application app = ctx.getApplication();
    HtmlPanelGrid panel = (HtmlPanelGrid) app.createComponent(HtmlPanelGrid.COMPONENT_TYPE);
    panel.setColumns(2);

    Class currentClass = super.entityClass;
    while(!currentClass.equals(Object.class)) {
        Field fields[] = currentClass.getDeclaredFields();
        for(Field field: fields) {
            Annotation id = field.getAnnotation(Id.class);
            Annotation embeddedId = field.getAnnotation(EmbeddedId.class);
            OneToMany oneToMany = field.getAnnotation(OneToMany.class);
            ManyToMany manyToMany = field.getAnnotation(ManyToMany.class);
            Transient transientTag = field.getAnnotation(Transient.class);
            Temporal temporal = field.getAnnotation(Temporal.class);



            if(id == null && embeddedId == null && oneToMany == null && manyToMany == null && transientTag == null) {
                int modifiers=field.getModifiers();
                if(!Modifier.isStatic(modifiers)) {
                    HtmlOutputLabel label = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);

                    String name = field.getName();
                    Class clazz = field.getType();

                    panel.getChildren().add(label);
                    label.setFor(name);
                    label.setValue(StringUtil.capitalize(name)+":");

                    String expression = "#{__g4cController.entity."+name+"}";
                    ValueExpression valueExpression = app.getExpressionFactory()
                            .createValueExpression(ctx.getELContext(),
                                    expression,
                                    clazz);

                    ManyToOne manyToOne = field.getAnnotation(ManyToOne.class);
                    if(manyToOne != null) {
                        HtmlSelectOneMenu input = (HtmlSelectOneMenu) app.createComponent(HtmlSelectOneMenu.COMPONENT_TYPE);
                        input.setId(name);
                        input.setValueExpression("value", valueExpression);
                        input.setLabel(name);

                        UISelectItems items = (UISelectItems) app.createComponent(UISelectItems.COMPONENT_TYPE);
                        input.getChildren().add(items);
                        String manyToOneClassName = field.getType().getSimpleName().toLowerCase();
                        String itemsExpression = "#{"+manyToOneClassName+".entityListSelectOne}";
                        ValueExpression itemsValueExpression = app.getExpressionFactory()
                                .createValueExpression(ctx.getELContext(),
                                        itemsExpression,
                                    SelectItem[].class);
                        items.setValueExpression("value", itemsValueExpression);
                        panel.getChildren().add(input);
                    } else {
                        if(temporal != null) {
                            if(temporal.value().equals(TemporalType.DATE)) {
                                UICalendar input = (UICalendar) app.createComponent(UICalendar.COMPONENT_TYPE);
                                input.setId(name);
                                input.setValueExpression("value", valueExpression);
                                input.setDatePattern("dd/MM/yyyy");
                                //input.setConverter(new DateConverter());
                                panel.getChildren().add(input);
                            }
                        } else {
                            HtmlInputText input = (HtmlInputText) app.createComponent(HtmlInputText.COMPONENT_TYPE);
                            input.setId(name);
                            input.setValueExpression("value", valueExpression);
                            input.setLabel(name);
                            input.setSize(50);
                            input.setMaxlength(255);
                            panel.getChildren().add(input);
                        }

                    }
                }
            }
        }
        currentClass = currentClass.getSuperclass();
    }
    return panel;
}

实体 Bean 示例:

@Entity

公共类 Istituto 实现可序列化,IBaseEntity { 私有静态最终长serialVersionUID = 1L;

@Id
@SequenceGenerator(name="IstitutoGenerator", sequenceName="ISTITUTO_SEQ", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="IstitutoGenerator")
@Column(name="ID_ISTITUTO")
private int idIstituto;

@NotNull
private String nome;

@NotNull
private String indirizzo;

@NotNull
private String comune;

@NotNull
@Pattern(regexp="[0-9][0-9][0-9][0-9][0-9]", message="Il CAP deve essere composto da 5 numeri")
private String cap;

@OneToMany(mappedBy="istituto")
private Set<Classe> classes;

public Istituto() {
}

public int getIdIstituto() {
    return this.idIstituto;
}

public void setIdIstituto(int idIstituto) {
    this.idIstituto = idIstituto;
}

public String getCap() {
    return this.cap;
}

public void setCap(String cap) {
    this.cap = cap;
}

public String getComune() {
    return this.comune;
}

public void setComune(String comune) {
    this.comune = comune;
}

public String getIndirizzo() {
    return this.indirizzo;
}

public void setIndirizzo(String indirizzo) {
    this.indirizzo = indirizzo;
}

public String getNome() {
    return this.nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public Set<Classe> getClasses() {
    return this.classes;
}

public void setClasses(Set<Classe> classes) {
    this.classes = classes;
}

@Override
public Integer getId() {
    return this.getIdIstituto();
}

@Override
public int hashCode() {
    int hash = 0;
    hash += this.getIdIstituto();
    return hash;
}

@Override
public boolean equals(Object object) {
    if (!(object instanceof Istituto)) {
        return false;
    }
    Istituto other = (Istituto) object;
    if  (this.getIdIstituto() != other.getIdIstituto()) {
        return false;
    }

    return true;
}

@Override
public String toString() {
    return this.getNome();
}

}


您必须添加一个实例javax.faces.validator.BeanValidator到您的输入组件:

input.addValidator(new BeanValidator());

原因是在标签执行期间添加了默认验证器(BeanValidator 已注册为一个):http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-635 http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-635.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSF 2 动态表单和 Bean 验证 JSR 303 的相关文章

  • 在 JRE 级别限制密码套件

    我们的 Java 应用程序公开了许多不同的接口 SMTP FTP HTTP 并通过 SSL TLS 进行保护 现在的目标是限制这些接口上允许的密码套件仅包含 强 密码套件 我已经有了一个列表 并且很清楚如何使其适用于特定套接字 socket
  • 如何制作行业标准的桌面Java应用程序? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 连接 Netbeans 和 MySQL 但出现大整数错误

    所以我正在尝试向我的 Netbeans 数据库 即 MySQL 添加新连接 但我遇到了大整数转换错误 有人可以帮助我吗 详细地 我右键单击现有的MySQL 服务器位于 localhost 3306 root 已断开连接 gt gt 选择co
  • Java中使用正则表达式确定字符串是否为URL [重复]

    这个问题在这里已经有答案了 可能的重复 检查字符串是否为有效 URL 的最佳正则表达式是什么 https stackoverflow com questions 161738 what is the best regular express
  • Primefaces 中动态生成条形图

    我正在使用 Primefaces 4 0 我需要根据查询结果的数量生成条形图 条形图的标题和颜色也应该能够为所有使用查询结果的人动态设置 条形图示例如下
  • 行类型 Spark 数据集的编码器

    我想写一个编码器Row https spark apache org docs 2 0 0 api java index html org apache spark sql Row html输入 DataSet 用于我正在执行的地图操作 本
  • 何时在java中使用get/set方法[重复]

    这个问题在这里已经有答案了 我想知道何时在我的类中使用 get 和 set 方法 getName setName 以及何时简单classVariable name 反而 classVariable getName 这是使用 set 和 ge
  • 在循环中使用 if 语句? - 加工

    假设我必须在 for 循环中使用 if 语句 并且 for 循环在特定条件下触发 而 if 语句仅在 for 循环达到特定阶段时触发 例如 条件是一个计数器 当发生特定事件 例如球从屏幕上掉下来 时 该计数器会进行计数 每次球穿过屏幕时 都
  • “错误:无法找到或加载主类 org.apache.hadoop.util.RunJar”是什么意思?

    我正在尝试运行一个示例 因为它指出 Hadoop 实践 一书 http www manning com lam 第 15 页 这是需要运行的命令 bin hadoop jar hadoop examples jar 但我收到这个错误 Err
  • Java 正则表达式中 \w 和 \b 的 Unicode 等效项?

    许多现代正则表达式实现解释 w字符类简写为 任何字母 数字或连接标点符号 通常 下划线 这样 正则表达式就像 w 匹配像这样的词hello l ve GO 432 or gefr ig 不幸的是 Java 没有 在爪哇 w仅限于 A Za
  • Spring REST 控制器返回带有空数据的 JSON [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个简单的 Spring Boot Web 应用程序 我正在尝试从服务器接收一些数据 控制器返回一个集合 但浏览器收
  • 如何在首次运行时填充大型 SQLite 数据库

    我正在开发一个基于 SQLite 数据库的字典应用程序 该数据库包含超过 300 000 行 问题在于 最终形式的数据库文件由全文索引表组成 并且重量远远超过150Mb 我通过创建无内容的 fts4 表设法将 db 文件大小降至最低 数据库
  • 返回 Consumer 表达式内的 Method 值

    我试图在方法中返回一个布尔值 并且我正在使用消费者函数 有什么方法可以直接在 Consumer 表达式中返回该值吗 这是代码 private static boolean uuidExists UUID uuid MySQL getResu
  • Spring WebFlux:在 Spring Data MongoDB 反应存储库中的 null 值时发出异常?

    我正在尝试学习如何使用 MongoDB 反应存储库spring boot 2 0 0 M2 但我担心我没有按预期做事 这是我的方法之一 试图找到一个User通过他们的电子邮件 但如果没有 该方法应该抛出异常 Override public
  • 使用pdfbox从pdf中提取图像

    我正在尝试使用 pdfbox 从 pdf 中提取图像 示例 pdfhere http www ignou ac in upload questionpaper CS 74 PDF 但我只得到空白图像 我正在尝试的代码 public stat
  • RecyclerView onItemClickListener 不工作

    我正在研究回收视图并尝试对 recyclerview 的每个项目使用点击侦听器界面 这是我的活动课程 public class LegacyHomeActivity extends ActivityBaseDrawer private Li
  • Java:字符串连接和变量替换的最佳实践[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在 Java 中连接字符串和添加变量值的方法有太多 我应该如何选择一个 优点 缺点 最佳用例等 MessageFormat forma
  • 使用电子邮件、用户名和密码进行 Firebase 身份验证

    我想知道是否可以使用电子邮件和用户 ID 密码登录 我有一个项目 我希望用户添加一个唯一的号码 实际上是我们公司提供的工作识别号码 以便能够签名参与该计划的人员将继续留在公司就业 即使电子邮件和密码正确但用户 ID 错误 我也需要 fire
  • 注意通知持续时间

    是否可以将抬头通知的持续时间设置为无限 现在它只显示 5 秒 已经尝试过不同的事情 例如更改类别 但持续时间始终为 5 秒 这是我的代码 Notification notification notificationBuilder setCa
  • 无法使用 Struts 2 重定向 JSP 文件并显示值

    我创建了一个简单的程序 使用文本字段获取用户的名字和姓氏 但问题是 当我单击提交按钮时 我无法将其重定向到另一个显示用户名字和姓氏的 jsp 文件 这是我的HelloAction class package com novamsc trai

随机推荐

  • 创建一个 PHP 文件来下载某个站点的所有链接

    我最近在我的 Firefox 中安装了附加组件 DownThemAll 当我看到它下载大量的 pk3 文件 开源第一人称射击游戏的地图文件 时 我想知道我是否可以使用 PHP 做同样的事情 这就是我的想法 foreach glob http
  • gitignore 除了子子文件夹中的文件之外的所有文件

    我已经尝试了 gitignore 的多种组合 但没有一个能满足我的需要 我有这棵树 jobs jobs projecta config xml jobs projecta garbage jobs projecta more garbage
  • 如何从 jar/bat/ 运行独立的 TestNG 项目

    我有一个 TestNG 项目 没有任何主类 目前它像 Run As TestNG 一样运行 我想将其导出为可运行的 jar 或 jar 以便任何人都可以从命令行输入命令并开始运行测试用例 有人可以帮我解决这个问题吗 或建议任何其他方式以可运
  • 又一个浮点问题

    我已经阅读了这里有关浮点的大部分帖子 并且我了解使用 IEEE 754 并且仅根据以二进制存储数字的性质 无法表示某些分数的基本问题 我试图弄清楚以下问题 如果Python和JavaScript都使用IEEE 754标准 为什么在Pytho
  • 返回 PL/SQL 函数中的表

    我正在开发一个 SQL 项目 我想创建一个返回表的 sql Plus 函数 我做了这样的事情 但它不起作用 我不知道为什么 CREATE OR REPLACE FUNCTION changeNbPersonnes recette IN in
  • ggpairs 中的部分 cor (pcor.test)

    我可以用吗pcor from ppcor 或者实际上将我预先制作的任何相关矩阵放入以下代码中ggpairs 在里面upper 代替cor 我想在 ggpairs 中集成一个部分相关矩阵或 pcor library GGally a lt a
  • 在 Rails 3 中检测用户操作系统的最简单方法是什么?

    简单的 Rails 应用程序 主要是脚手架 我想检测用户是使用 Android 还是 iPhone 访问我的应用程序 最简单的方法是什么 if request env HTTP USER AGENT downcase match andro
  • 使用相对布局制作动态视图时面临的问题

    我正在使用相对布局动态构建视图 网格 例如 如果有 1 个用户 网格与用户 1 https i stack imgur com 4Dqsr png 1 https i stack imgur com 4Dqsr png 如果有 2 个用户
  • FileSystemWatcher 创建 1000 个文件失败

    我正在使用 FileSystemWatcher 监视文件夹 A 如果创建文件或将文件复制到该文件夹 中 它将被移动到文件夹 B 我通过右键单击 选择 新建 选择 文本文档 在文件夹 A 中创建了一个文件 该文件立即移至文件夹 B 但是 如果
  • 如何检测颤振中选定的键盘语言?

    如何在打字时检测当前的键盘语言 我正在尝试在聊天应用程序中实现翻译 我需要知道其他用户正在输入哪种语言 以便我可以根据用户的母语知道要翻译哪些文本 目前flutter中似乎没有办法做到这一点 我在 GitHub 上提交了一个问题 如果您想帮
  • 如何制作一个收集到 com.google.common.collect.ImmutableSet 的 java.util.stream.Collector?

    这对我来说似乎太棘手了 因为ImmutableSet实例仅使用以下内容构建ImmutableSet Builder实例 未实现Collection所以你不能只使用Collectors toCollection ImmutableSet ne
  • Vaadin 10/11 和嵌入式 Jetty

    我在 Vaadin 8 5 1 上开发了中型应用程序 Jetty 嵌入式 9 4 8 用作 Vaadin servlet 的 Servlet 容器 在 Java 代码中 我初始化 Jetty 实例 创建 Vaadin servlet 并将其
  • 多个 Web 服务的集中身份验证和授权

    有几种不同的 Web 服务 使用的各种技术 例如 Java NET Python Perl 以及将来可能会使用的更多技术 属于不同的组织 并且必须限制对这些 Web 服务的访问 这个想法是拥有一个中央身份验证和授权服务器 只负责授予对每个
  • 为什么要预测一个分支,而不是简单地并行执行两个分支?

    我相信 在创建 CPU 时 如果选择了错误的分支 分支预测会导致速度显着下降 那么 为什么 CPU 设计者选择一个分支 而不是简单地执行两个分支 然后在确定选择了哪个分支后就切断其中一个分支呢 我意识到这只能在少量指令内深入 2 或 3 个
  • 如何避免多个嵌套 IF

    我目前正在尝试重组我的程序 使其更加面向对象并更好地实现已知模式等 我有很多嵌套的 IF 语句 想去掉它们 我该怎么办 我的第一个方法是在有例外的情况下完成它 所以例如 public static Boolean MyMethod Stri
  • Pythonlogging.getLogger 在 AWS Glue python shell 作业中不起作用

    我正在尝试使用 Python 为我的 AWS Glue 作业设置一个记录器logging模块 我有一个使用 Python 版本 3 的类型为 Python Shell 的 Glue 作业 如果我实例化记录器而没有任何记录 则记录工作正常na
  • Android EditText 原生选择器

    我尝试将自己的设计应用于 edittext 并在启用 聚焦等情况下使用 android 本机选择器 问题是 每次我触摸 edittext 并且本机选择器正在工作时 我的 edittext 都会变小 任何人都可以建议为什么会发生这种情况吗 这
  • Ops 代表什么?

    在 Scala 社区中 我经常看到课程以Ops很常见 例如 ApplicativeErrorIdOps 什么是Ops代表 Ops 运营 这不仅在 Scala 中而且在一般情况下都是非常常用的快捷方式 在 Cats 中 它被用作扩展方法类的后
  • 如何通过此代码使用 jquery 更改 css 属性

    business 当前设置为背景 323232 我怎样才能将其更改为 000 当我点击 business 并在菜单关闭后返回到 323232 后 document ready function business click function
  • JSF 2 动态表单和 Bean 验证 JSR 303

    我从带注释的 bean 开始生成一个动态表单 使用 Hibernate Validator 对同一个 bean 进行注释以进行验证 表单已正确呈现 但提交表单时 验证步骤并未执行 如果我使用 jsf 标记编写相同的表单 则验证可以正常工作