2016-03-21 10 views
4

私は春のブートWebアプリケーションを持っていると私はこのようなコントローラの値を拒否:日付dt1dt2前でない場合フォーマットスプリングエラーメッセージの引数

@RequestMapping(value = "/create", method = RequestMethod.POST) 
public String createSubmit(@ModelAttribute("createForm") CreateForm createForm, BindingResult result, SessionStatus status) { 
    DateTime dt1 = createForm.getDt1(); 
    DateTime dt2 = createForm.getDt2(); 

    if (!dt1.isBefore(dt2)){ 
     result.rejectValue("fieldId", "validation.isbefore", new Object[]{dt1, dt2}, "first date must be before second"); 
    } 
} 

ので、値が拒否されます。今、私はmessages_en.propertiesでこのエントリではかなり標準ResourceBundleMessageSourceを持っている:検証エラーがが発生した場合

validation.isbefore = Start date {0} must be before end date {1} 

、私は(dt1dt2の両方がメッセージをフォーマットするために彼らのtoString()を使用しています)メッセージStart date 3/21/16 5:01 PM must be before end date 3/20/16 5:01 PMを取得します。

さて、java.text.MessageFormatはいくつかのフォーマット、すなわち{0,date,short}をサポートしています。しかし、それはjava.util.Dateでのみ有効であり、Joda Time(またはその他のカスタムクラスではありません)ではありません。

エラーメッセージ引数のフォーマット方法をカスタマイズする方法はありますか?私は妥当性検査の時にそれをしたくありません(最終コードでは、バリデータ自体がコントローラから分離され、選択された言語についての情報を持たないので、使用する日付形式はわかりません)。

+0

本当に、あなたは、サーバー上のプレゼンテーションロジックを扱うべきではありません。 –

+0

@EngineerDolleryサーバーはHTML(Spring MVC/Thymeleaf)を生成する責任があるので、サーバー上でプレゼンテーション/ローカライズを処理する必要があります。 –

+0

HTMLは構造体のためのもので、CSS(時にはjavascript)がプレゼンテーションを担当します。 Javaは、検証、ビジネスルール、CRUDを担当します。これをフォーマットするにはjavascriptが必要ですが、日付を簡単に識別できるようにする必要があります。その後、GUIの人々はL&Fの問題に対処して、サーバーコードを書くことに乗り出すことができます。 :) –

答えて

0

コントローラ内のCustomDateEditorとWebBindingを使用して、日付の書式を設定できます。あなたのコントローラにこのようなものを追加してみてください:

@Controller 
public class MyController { 
     @InitBinder 
     public void customizeBinding (WebDataBinder binder) { 
      SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); 
      binder.registerCustomEditor(Date.class, "dt1", 
       new CustomDateEditor(dateFormatter, true)); 
      binder.registerCustomEditor(Date.class, "dt2", 
       new CustomDateEditor(dateFormatter, true)); 
     } 

     @RequestMapping(value = "/create", method = RequestMethod.POST) 
     public String createSubmit(@ModelAttribute("createForm") CreateForm 
     createForm, BindingResult result, SessionStatus status) { 
      DateTime dt1 = createForm.getDt1(); 
      DateTime dt2 = createForm.getDt2(); 

      if (!dt1.isBefore(dt2)){ 
       result.rejectValue("fieldId", "validation.isbefore", new 
       Object[]{dt1, dt2}, "first date must be before second"); 
      } 
     } 

} 

私がこの例を使用して修正:うまくいけばhttp://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/validation.html#beans-beans-conversion

http://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-custom-property-editor/

ここで組み込みプロパティエディタの公式​​春のドキュメントですそれをStringに変換するときにformatメソッドを使用して、必要な形式を表示することができます。

そうでない場合、あなたは本当に奇妙な何かをして、独自の日時に日時を延長してのtoString()メソッドをオーバーライドする必要がありますが、それは解決策があまりにも強引かもしれように、それはそうです。

public class MyDateTime extends DateTime { 

     @Override 
     public toString() { 
      return new SimpleDateFormat("yyyy-MM-dd).format(this); 
     } 
} 

はその後

MyDateTime dt1 = createForm.getDt1(); 
MyDateTime dt2 = createForm.getDt2();