jsf 自定义所有错误信息

Posted

技术标签:

【中文标题】jsf 自定义所有错误信息【英文标题】:jsf customize all error messages 【发布时间】:2017-08-22 22:24:21 【问题描述】:

我的任务是将应用程序的所有消息翻译成另一种语言,不同于英语。棘手的部分是 JSF 框架本身生成的消息。我遇到了各种文章,展示了如何自定义某些特定的转换或验证错误消息,但我对自定义应用程序可能生成的每条可能的错误消息很感兴趣(例如,包括身份验证和导航错误消息)。

是否有包含所有可能错误消息的文件?

到目前为止,我遇到了一个名为 Messages.properties 的文件,位于 jsf-api jar 中,其中包含 Validation,Converter 和 Component 错误消息。但这还不够,除此之外还有很多其他错误。

这个jar实际上被命名为jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.jar并且位于jboss-eap\modules\system\layers下\base\javax\faces\api\main 文件夹。 在这个 jar 中,Messages.properties 文件位于 javax\faces 包下。

我目前使用 Red Hat JBoss Enterprise Application Platform - Version 6.4.0.GA, JSF Implementation-Version: 2.1.28.Final-redhat-1

【问题讨论】:

这里已经回答了这个问题:***.com/a/2668602/637609 我读了那个答案,我点击了 JSF 规范的链接,那里给出的键都适合以下 3 个包之一:javax.faces.component、javax.faces.converter、javax .faces.validator。我已经在问题中提到我正在寻找其他类型的错误,除了“验证、转换器和组件错误”。如果应用程序引发导航异常怎么办?我也需要处理。例如,javax.faces.application.NavigationCase.fromViewId 可能是“无法找到与 from-view-id .. 匹配的导航案例”案例的消息键 【参考方案1】:

问题可以分为两部分:

    如何覆盖框架错误消息?

    JSF 框架可以生成的所有可能的错误消息列表是什么?

第 1 部分:覆盖框架的错误消息

在我的项目中,在WebContent\WEB-INF 下,有faces-config.xml,其中包含<message-bundle>resources</message-bundle>。 “资源”指向 src\resources.properties。在这个 .properties 文件中,我只需要添加相应的条目,比如

javax.faces.converter.DateTimeConverter.DATE=2: ''0'' non poteva essere inteso come una data.

如果应用程序产生此类错误,将显示翻译后的消息。 但是,正如我从Cannot override validation error message 了解到的那样,在 src 下使用 resources.properties 文件是特定于 maven 的。不同的封装技术可能需要不同的解决方案。

第 2 部分:所有错误消息列表

查看 javax.faces.jar http://www.java2s.com/Code/Jar/j/Downloadjavaxfacesjar.htm 中包含的文件,我看到以下包:

javax.faces.application

javax.faces.bean

javax.faces.component

javax.faces.context

javax.faces.convert

javax.faces.el

javax.faces.event

javax.faces.lifecycle

javax.faces.model

javax.faces.render

javax.faces.validator

javax.faces.view

javax.faces.webapp

对于每个包中的每个类,我必须在 resources.properties 中为此类可能引发的每个错误添加条目。 但是一个类可能引发的错误是什么? resource.properties 中的条目应该是什么样的?

我让自己以我在 jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1 内的 Messages.properties 文件中找到的条目为指导。jar (我在问题中提到过)。它具有以下条目,其中包括:

# ==============================================================================
# Component Errors
# ==============================================================================
javax.faces.component.UIInput.CONVERSION=0: Conversion error occurred.
javax.faces.component.UIInput.REQUIRED=0: Validation Error: Value is required.
javax.faces.component.UIInput.UPDATE=0: An error occurred when processing your submitted information.

在我的 IDE (eclipse) 中,我单击导入语句 import javax.faces.component.UIInput; 以导航到 UIInput.class 。在类文件编辑器中,我有以下几行:

  // Field descriptor #193 Ljava/lang/String;
  public static final java.lang.String CONVERSION_MESSAGE_ID = "javax.faces.component.UIInput.CONVERSION";

  // Field descriptor #193 Ljava/lang/String;
  public static final java.lang.String REQUIRED_MESSAGE_ID = "javax.faces.component.UIInput.REQUIRED";

  // Field descriptor #193 Ljava/lang/String;
  public static final java.lang.String UPDATE_MESSAGE_ID = "javax.faces.component.UIInput.UPDATE";

我注意到String字段的值正是必须在resources.properties中添加的键,例如javax.faces.component.UIInput.CONVERSION。

对于一个新类,例如 javax.faces.validator.RegexValidator 类,我将执行以下操作:在类文件编辑器中打开它,选择名称以 _ID 结尾的那些字段,例如:

  // Field descriptor #30 Ljava/lang/String;
  public static final java.lang.String VALIDATOR_ID = "javax.faces.RegularExpression";

  // Field descriptor #30 Ljava/lang/String;
  public static final java.lang.String PATTERN_NOT_SET_MESSAGE_ID = "javax.faces.validator.RegexValidator.PATTERN_NOT_SET";

  // Field descriptor #30 Ljava/lang/String;
  public static final java.lang.String NOT_MATCHED_MESSAGE_ID = "javax.faces.validator.RegexValidator.NOT_MATCHED";

  // Field descriptor #30 Ljava/lang/String;
  public static final java.lang.String MATCH_EXCEPTION_MESSAGE_ID = "javax.faces.validator.RegexValidator.MATCH_EXCEPTION";

并将以下条目添加到 resources.properties 文件:

javax.faces.RegularExpression=custom message
javax.faces.validator.RegexValidator.PATTERN_NOT_SET=custom message
javax.faces.validator.RegexValidator.NOT_MATCHED=custom message
javax.faces.validator.RegexValidator.MATCH_EXCEPTION=custom message

不幸的是,鉴于必须提供大量错误消息的类,我认为这不是一个可行的解决方案。

更新

我刚刚意识到为什么只应该提供转换和验证错误消息:因为它们与用户输入有关,程序员无法控制。程序员必须正确处理所有其他错误,如导航相关问题。此类错误首先不应出现,因此无论如何翻译这些消息是没有意义的。

【讨论】:

以上是关于jsf 自定义所有错误信息的主要内容,如果未能解决你的问题,请参考以下文章

gin框架自定义验证错误提示信息

从零开发区块链应用--自定义业务错误信息

自定义 ocelot 中间件输出自定义错误信息

使用 PHP 7 显示自定义错误页面 - 对我来说是详细信息,对用户来说是通用的

封装表单自定义错误信息。(阻止默认错误信息提示,添加自定义错误信息提示)

Parsley 自定义动态错误信息