Jsf 来自@Pattern的自定义消息未显示在Double属性上

Jsf 来自@Pattern的自定义消息未显示在Double属性上,jsf,bean-validation,Jsf,Bean Validation,我正在尝试使用JSR-303bean验证 我添加了maven依赖项 <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> 这是一种观点: <p:inputTe

我正在尝试使用JSR-303bean验证

我添加了maven依赖项

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
这是一种观点:

<p:inputText id="price"
    value="#{inventoryMB.product.price}">
    <f:convertNumber type="number" maxFractionDigits="0" />
</p:inputText>
<p:message for="price" />

属性中的自定义消息不起作用。有什么不对?

您混合了几个概念,但并不完全清楚您到底想要什么,因此很难提供正确的答案

首先,@模式只对字符串属性有效。如果只允许[0-9],请使用整数或Long而不是Double。如有必要,请使用a以不低于0。这样你也可以摆脱整个。然而,这样您就不能通过JSR303验证为数字。这要归功于Java的强类型特性,它已经不可能用语法上无效的数字来设置属性。您所面临的转换错误实际上来自JSF,当使用java.lang.Number属性(例如Double、Long和friends)时,JSF已经隐式地与默认设置一起使用

最好是在JSF端指定转换错误消息。您可以通过指定输入字段的converterMessage属性来执行以下操作:

<p:inputText ... converterMessage="#{bundle['not.a.valid.number']}" />
或者使用此键覆盖JSF默认转换错误消息via:

javax.faces.converter.NumberConverter.NUMBER_detail={2}: ''{0}'' is not a number. Example: {1}
如果您确实需要能够通过jsr303bean验证的@Pattern对其进行验证,那么将该属性声明为字符串。但是这完全破坏了Java的强类型特性。

您混合了几个概念,并且不完全清楚您到底想要什么,因此很难提供正确的答案

首先,@模式只对字符串属性有效。如果只允许[0-9],请使用整数或Long而不是Double。如有必要,请使用a以不低于0。这样你也可以摆脱整个。然而,这样您就不能通过JSR303验证为数字。这要归功于Java的强类型特性,它已经不可能用语法上无效的数字来设置属性。您所面临的转换错误实际上来自JSF,当使用java.lang.Number属性(例如Double、Long和friends)时,JSF已经隐式地与默认设置一起使用

最好是在JSF端指定转换错误消息。您可以通过指定输入字段的converterMessage属性来执行以下操作:

<p:inputText ... converterMessage="#{bundle['not.a.valid.number']}" />
或者使用此键覆盖JSF默认转换错误消息via:

javax.faces.converter.NumberConverter.NUMBER_detail={2}: ''{0}'' is not a number. Example: {1}
如果您确实需要能够通过jsr303bean验证的@Pattern对其进行验证,那么将该属性声明为字符串。但这完全违背了Java的强类型特性。

我使用Double value,因为DB中的字段存储为Double。有没有更好的方法来验证双精度或整数?例如,omnifaces?您最好的选择是定制JSF转换器。您可以在解析和返回double之前验证字符串值上的模式。OmniFaces没有为此提供内置功能。我以前回答过类似的问题:我使用Double value,因为DB中的字段存储为Double。有没有更好的方法来验证双精度或整数?例如,omnifaces?您最好的选择是定制JSF转换器。您可以在解析和返回double之前验证字符串值上的模式。OmniFaces没有为此提供内置设施。我以前回答过类似的问题: