2

タイムスタンプ付きのオブジェクトを送り返すフォームを作成しようとしています。現在、入力形式は である必要があります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>

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

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]]
4

2 に答える 2

0

参考までに、完全なTimestampカスタム エディターのコードを次に示します (getAsText() もサポートしています) 。目的の日付/タイムスタンプ パターンに一致させるか、または 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");}
于 2014-08-19T08:49:29.067 に答える