2012-05-13 16 views
1

フォームを作成しようとしていますが、これはタイムスタンプ付きのオブジェクトを返送します。今、入力フォーマットは[yyyy-MM-dd HH:mm:ss]でなければなりません。タイムスタンプを[dd.MM.yyyy HH:mm]の形式で入力したいのですが、どうすれば入力フォーマットを変更できますか?春の日付変更の入力形式

オブジェクトクラス:

public class Test { 
    private Timestamp dateStart; 

    public Timestamp getDateStart() { 
     return dateStart; 
    } 
    public void setDateStart(Timestamp dateStart) { 
     this.dateStart = new Timestamp(dateStart.getTime()); 
    } 
} 

コントローラ方法:

@RequestMapping(value="test", method = RequestMethod.POST) 
public View newTest(@ModelAttribute("test") Test test, Model model) { 
    //save the Test object 
} 

JSPフォーム:

<form:form action="service/test" method="post" modelAttribute="test"> 
    <form:input type="text" path="dateStart" /> 
</form:form> 

Iは、フォーマットが正しくない場合、このエラーが発生します。

Field error in object 'test' on field 'dateStart': rejected value [22.05.2012 14:00]; codes [typeMismatch.test.dateStart,typeMismatch.dateStart,typeMismatch.java.sql.Timestamp,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [test.dateStart,dateStart]; arguments []; default message [dateStart]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.sql.Timestamp' for property 'dateStart'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "22.05.2012 14:00" from type 'java.lang.String' to type 'java.sql.Timestamp'; nested exception is java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]] 
+0

多分これがお手伝いします。 http://stackoverflow.com/questions/10565481 –

+0

本当にありがとう、私は他のユーザーのための答えを投稿します。 – lmazgon

答えて

8

私は答えを得たトマシュのおかげで、私はコントローラにバインダーメソッドを追加する必要があります。

@InitBinder 
public void binder(WebDataBinder binder) {binder.registerCustomEditor(Timestamp.class, 
    new PropertyEditorSupport() { 
     public void setAsText(String value) { 
      try { 
       Date parsedDate = new SimpleDateFormat("dd.MM.yyyy HH:mm").parse(value); 
       setValue(new Timestamp(parsedDate.getTime())); 
      } catch (ParseException e) { 
       setValue(null); 
      } 
     } 
    }); 
} 
0

FYI、ここでは完全なタイムスタンプのカスタムエディタ(それはgetAsTextを(サポート)あまりにも)のためのコードがあり、 http://adfinmunich.blogspot.com/2011/04/how-to-write-sqltimestamppropertyeditor.htmlの礼儀、ちょうどあなたの希望の日付/タイムスタンプのパターンに一致するDEFAULT_BATCH_PATTERNを変更したり、あなたがSqlTimestampPropertyEditorを構築する際に、所望のパターンを送信します。

package org.springframework.beans.custompropertyeditors; 

import java.beans.PropertyEditorSupport; 
import java.sql.Timestamp; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 

/** 
* Property editor for java.sql.Timestamp, supporting SimpleDateFormat. 
* 
* Using default Constructor uses the pattern yyyy-MM-dd 
* Using the constructor with String, you can use your own pattern. 
* 
*/ 
public class SqlTimestampPropertyEditor extends PropertyEditorSupport { 

public static final String DEFAULT_BATCH_PATTERN = "yyyy-MM-dd"; 

private final SimpleDateFormat sdf; 

/** 
* uses default pattern yyyy-MM-dd for date parsing. 
*/ 
public SqlTimestampPropertyEditor() { 
    this.sdf = new SimpleDateFormat(SqlTimestampPropertyEditor.DEFAULT_BATCH_PATTERN); 
} 

/** 
* Uses the given pattern for dateparsing, see {@link SimpleDateFormat} for allowed patterns. 
* 
* @param pattern 
*   the pattern describing the date and time format 
* @see SimpleDateFormat#SimpleDateFormat(String) 
*/ 
public SqlTimestampPropertyEditor(String pattern) { 
    this.sdf = new SimpleDateFormat(pattern); 
} 

/** 
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String) 
*/ 
@Override 
public void setAsText(String text) throws IllegalArgumentException { 

    try { 
     setValue(new Timestamp(this.sdf.parse(text).getTime())); 
    } catch (ParseException ex) { 
     throw new IllegalArgumentException("Could not parse date: " + ex.getMessage(), ex); 
    } 
} 

/** 
* Format the Timestamp as String, using the specified DateFormat. 
*/ 
@Override 
public String getAsText() { 
    Timestamp value = (Timestamp) getValue(); 
    return (value != null ? this.sdf.format(value) : ""); 
} 
} 

このクラスを使用するには、以下の@InitBinderを定義します

@InitBinder 
public void binder(WebDataBinder binder) {binder.registerCustomEditor(Timestamp.class, 
    new org.springframework.beans.custompropertyeditors.SqlTimestampPropertyEditor();} 

あなたが使用することができ、この特定の例ので、SqlTimestampPropertyEditorにコンストラクタでそれを供給し、非デフォルトの日付/タイムスタンプのパターンを使用する場合:

@InitBinder 
public void binder(WebDataBinder binder) {binder.registerCustomEditor(Timestamp.class, 
    new org.springframework.beans.custompropertyeditors.SqlTimestampPropertyEditor("dd.MM.yyyy HH:mm");} 
+0

このようにするのはお勧めしません。これは、スレッドセーフではないSimpleDateFormatの同じインスタンスを使用するためです(http://stackoverflow.com/questions/6840803/simpledateformat-thread-safety)。もちろん、コードの構造はより整理されていますが、要求ごとに新しいSimpleDateFormatを作成しない限り、安全ではありません。 – lmazgon