【问题标题】:Extending JSF validation in application在应用程序中扩展 JSF 验证
【发布时间】:2012-12-16 11:43:57
【问题描述】:

我们正在开发一个基于 JSF (v2.0) 框架的 Web 应用程序。我们需要在我们的应用程序中进行自定义验证。我们决定通过实现Validator 类来扩展JSF validation framework

假设我们有多个需要验证的输入字段。这些输入字段是First Name, Last NameEmail Address. 我们需要用户在这些字段中输入信息。并且电子邮件地址字段将有两个验证 - RequiredisValidEmailAddress

我们应该能够在First Name, Last NameEmail Address 字段中使用自定义Required 验证。 但每次我希望为每个字段显示不同的错误消息。例如First Name,我想显示First Nameis required. In case ofLast nameI want to displayLast name is required`。

如何为多个字段重复使用相同的 Required 验证实现但错误消息不同?可以在 JSF 中做到这一点吗?可以告诉我吗?

【问题讨论】:

    标签: validation jsf


    【解决方案1】:

    首先,您不需要为 JSF 中的所需输入编写自己的验证逻辑。这是框架本身提供的基本便利之一。

    JSF 的验证框架完全从与验证相关的消息中抽象出来,因此两者不必相互依赖。您的选择:

    1. 每个输入组件都有一个validatorMessage 属性,允许您指定在验证错误时将显示给用户的文本/字符串。对于您的特定用例,JSF 更进一步为输入组件指定了requiredrequiredMessage 属性;分别强制执行所需的输入并显示专门用于所需输入验证的消息。这在您的用例中意味着您不需要为所需的输入编写自定义验证逻辑。

    2. 根据更好的设计原则,您可以在资源包中配置所有所需的验证/转换错误消息(例如 here),并在您的 jsf 视图中引用资源包中的条目。

    实现验证器接口需要您使用以下签名实现validate 方法

       public void validate(FacesContext ctxt, UIComponent comp, Object value) throws ValidatorException
    

    comp 是指正在验证的组件,您可以从中获取它的 Class、clientId 等。value 将提供来自组件的提交值

    【讨论】:

    • 我们不能使用资源包,因为我们决定将所有消息保存在数据库中以便可以轻松更改(无需部署)。即使是“requiredMessage”也可以通过编程而不是硬编码来派生吗?
    • @Apps 警告:错误/警告消息等元素最好从静态源中使用。您不希望每次有人搞砸网络表单中的条目时都访问数据库。话虽如此,您可以将所有消息加载到 ApplicationScoped bean 中并在属性中引用它的成员变量(对应于字符串类型消息)。您只需在应用程序范围的 bean 中实现加载消息(来自 DB、WS、文件等)的逻辑
    • 感谢 Kolossus。即使它存储在数据库中,我们也会在第一次从数据库中检索信息后将其存储在应用程序范围内。在所有后续请求中,它将从应用程序范围提供服务。我们可以使用 Validator 接口并为每个组件提供不同的错误消息吗?
    • @Apps 是的,你可以。就像我在回答中所说的那样,每个组件都有自己的 validatorMessage 属性,您可以在其中定义仅针对该组件的验证错误显示的文本
    • 谢谢。但是如何使自定义验证实现具有通用性,每个组件都有不同的消息?是否可以从客户端传递一些自定义属性,告诉自定义验证实现这是需要使用的错误消息键?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2016-09-26
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多