0

環境:

春 3.1.3.RELEASE

春のウェブフロー 2.3.0.RELEASE

最近、この質問をスプリング ソース フォーラムに投稿しました。参照: Spring Webflow フォーマットの問題

リファレンス ドキュメントに記載されている手順と、stackoverflow の上位の回答にも従いました。

答え

フォームが送信されてバインディングが発生したときに、無効な日付値を入力すると解析例外がスローされることを期待しています。しかし、私はこれが起こっているのを見ません。

また、例外がスローされた場合、フロントエンドにエラーメッセージを表示するにはどうすればよいですか?

アプリケーションで型変換の使用を開始したいと考えていました。以下の手順に従って、Spring MVC および SWF の型変換フォーマットを構成しました。

手順に従って、サーブレットコンテキストに追加しました

<!-- Enables controllers mapped with @RequestMapping annotations, formatting annotations @NumberFormat
    @DateTimeFormat, and JSR 303 style validation --> 
   <mvc:annotation-driven conversion-service="applicationConversionService1" />

<webflow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService" view-factory-creator="mvcViewFactoryCreator" development="true"/>

<bean id="defaultConversionService" class="org.springframework.binding.convert.service.DefaultConversionService"> 
        <constructor-arg ref="applicationConversionService1"/> 
   </bean>

Spring MVC と Spring Web Flow の両方で使用する独自のフォーマッターを登録する新しいクラスを作成しました。

@Component(value = "applicationConversionService1")
public class ApplicationConversionServiceFactoryBean extends
        FormattingConversionServiceFactoryBean {

    @Override
    protected void installFormatters(FormatterRegistry registry) {
      // Register the default date formatter provided by Spring
      registry.addFormatter(new DateFormatter("dd/MM/yyyy"));
    } 

}

サーバーにデプロイすると、コンテキストが正しく初期化され、クラスパス スキャンによって Bean が登録されます。

バインドするフォーム モデルで、日付フィールドに新しい dateformat 注釈を付けました。

@DateTimeFormat(pattern="dd/MM/yyyy")
    private Date revisedTermExpiryDate = new Date();

更新: 私はデバッグしていましたが、クラスパスに joda-time があるため、Spring が代わりに joda DateTimeFormatter を登録しており、解析は失敗していません。

注釈を実際に削除すると、期待どおりに解析例外をスローする DateFormatter が呼び出されますが、例外はフレームワークに飲み込まれます。

私の目的は、プレーンな DateFormatter をグローバルなデフォルト日付で登録し、厳密に解析 (lenient=false) し、解析例外を適切に処理することです。これは、Web フローごとにバリデーターで日付の解析を処理するよりも、優れた機能です。

ありがとう、シェーン。

4

1 に答える 1

0

更新 2:

アプリケーションで例外が飲み込まれた理由がわかりました。検証時にメッセージ コンテキストからメッセージをクリアしていました。

そのため、ユーザーが入力した無効な値が原因で日付フォーマッターが例外をスローした場合、Spring はこれを適切に処理し、そのフィールドに関連するメッセージ コンテキストに 4 つのエラー メッセージ キーを作成します。たとえば、フィールド modifiedTermExpiryDate が失敗した場合、4 つの新しいキーが作成されます。

  1. recordDecisionFormModel.revisedTermExpiryDate.type 不一致
  2. 改訂されたTermExpiryDate.typeMismatch
  3. java.util.Date.typeMismatch
  4. 型の不一致

必要なことは、messages.properties でこれらのキーの 1 つを検証メッセージで指定することだけです。

例:

revisedTermExpiryDate.typeMismatch=Revised Term Expiry Date: DATE IS INVALID

解決しました!!

于 2013-01-08T17:03:15.073 に答える