自定义转换器消息以包含带有粗体无效字符的输入

Customize converter message to include input with bolded invalid characters

Mojarra 2.1.29

考虑标准 javax.faces.Integer 转换器。如果我们输入无效号码,我们将收到消息:

'foo' must be a number consisting of one or more digits

如果数字包含无效字符,我需要按如下方式自定义消息,打印输入以及加粗的无效字符。例如 1234add

The number contains invalid charaters: 1234add

我认为不可能只定义我自己的自定义属性文件,其中包含如下消息:

javax.faces.converter.BigIntegerConverter.BIGINTEGER={2}: ''{0}'' must be a number consisting of one or more digits.

我是否必须编写自己的自定义转换器,它是 javax.faces.Integer 的子类?

是否可以在不编写自定义转换器的情况下以这种方式自定义错误消息?

是的,这是可能的。这只是 hacky 的原因有两个:

  • 格式化逻辑被封装在 EL 而不是可重复使用的 Java class 中(尽管您可以创建一个特殊的标记文件来防止在所有地方复制粘贴,以防您打算在其他地方重复使用相同的逻辑).
  • HTML 在 faces 消息中需要,而 <h:message> 不支持转义 HTML(因此需要手动抓取消息的 <h:outputText> 来显示消息).

这里是:

<h:inputText binding="#{input}"
    converter="javax.faces.Integer" 
    converterMessage="The number contains invalid charaters: #{input.submittedValue.replaceAll('(\d*)?(\D+)(\d*)?', '&lt;b&gt;&lt;/b&gt;')}" />
<h:outputText id="messageForInput" value="#{facesContext.getMessageList(input.clientId)[0].summary}" escape="false" />

注意 binding 指向局部变量而不是 bean 属性 的重要性。

另请参阅:

  • How do I add HTML code to JSF FacesMessage
  • Render JSF h:message with p element instead of span
  • How does the 'binding' attribute work in JSF? When and how should it be used?