1

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

我添加了maven依赖

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

我把ValidationMessages_es.properties和放进ValidationMessages_en.properties/WEB-INF/classes

这是模型:

@Pattern(regexp="[0-9]", message="{not.a.valid.number}")
private Double price;

这是观点:

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

当我输入无效号码时,我从验证器收到此消息:

form:price: 'ss' is not a number. Example: 99

我来自属性的自定义消息不起作用。怎么了?

4

1 回答 1

5

你混合了几个概念,并不完全清楚你到底想要什么,所以很难提供正确的答案。

首先,@Pattern作品只针对String属性。如果您打算[0-9]只允许,只需使用IntegerorLong代替Double. 如有必要,请使用 a@Min以不低于0。这样你也可以摆脱整体<f:convertNumber>。但是,这样您就无法通过 JSR 303 验证为数字。这要归功于 Java 的强类型特性,已经不可能使用语法上无效的数字设置属性。您面临的转换错误实际上来自 JSF <f:convertNumber>,当使用属性时,它也隐含地已经与默认设置一起java.lang.Number使用,例如Double,Long和朋友。

您最好的选择是在 JSF 端指定转换错误消息。您可以通过指定converterMessage输入字段的属性来做到这一点:

<p:inputText ... converterMessage="#{bundle['not.a.valid.number']}" />

或者通过<message-bundle>使用此键覆盖 JSF 默认转换错误消息:

javax.faces.converter.NumberConverter.NUMBER_detail={2}: ''{0}'' 不是数字。示例:{1}

如果您确实需要能够通过@PatternJSR303 bean 验证来验证它,那么将该属性声明为String. 但这完全违背了 Java 的强类型特性。

于 2013-09-23T18:53:26.243 回答