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から来ています.JSFは、プロパティが使用されている<f:convertNumber>ときにデフォルト設定で暗黙的に使用されています.java.lang.NumberDoubleLong

最善の策は、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 に答える