2011-09-15 1 views
1

一時クラスのプロパティのゲッター/セッターを介してのみ相互作用する永続化DateTimeフィールドを持つモデルクラスがあります。String date;およびString time;。必要に応じて永続化または取得されるDateTimeオブジェクトを作成するための非常に特殊な書式設定再生!モデルのセッターに「ランダム」文字列値を注入するフレームワークブートストラップ(Fixtures.loadModels( "initial-data.yaml))

問題は、yamlファイルからモデルをロードしたときに、timeフィールドのセッターがString私のプロジェクト/コード内の何にも対応していない値

ここには関連するメンバーだけのクラスがあります:

package models; 

import javax.persistence.*; 
import org.hibernate.annotations.*; 
import org.joda.time.*; 
import org.joda.time.format.*; 

import play.db.jpa.*; 

@javax.persistence.Entity 
public class Booking extends Model { 

    @Column 
    @Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime") 
    public DateTime datetime; 
    public Integer duration; 
    @Transient 
    public String date; 
    @Transient 
    public String time;  

    //default constructor called by play's model loader that sets default values that are required for the getters and setters to work. 
    public Booking() { 
    DateTimeFormatter fmt = DateTimeFormat.forPattern("'ISO8601':yyyy-MM-dd'T'HH:mm:ssZ"); 
    this.datetime = fmt.parseDateTime("ISO8601:1970-01-01T00:00:00+0200"); 
    //this.datetime = fmt.parseDateTime(this.date+"T"+this.time); 
    } 

    public void setDate(String dateStr) {  
    this.date = dateStr; 
    if (dateStr.contains("ISO")) { 
     DateTimeFormatter dt = DateTimeFormat.forPattern("'ISO8601':yyyy-MM-dd'T'HH:mm:ssZ"); 
     DateTime tmp = dt.parseDateTime(dateStr); 
     this.datetime = toDateTime(tmp.toString("yyyy-MM-dd"), getTime()); 
    } else { 
     this.datetime = toDateTime(dateStr, getTime()); 
    } 

    } 

    public void setTime(String timeStr) { 
    this.time = timeStr; //timeStr = "780" for some reason?! 
    if (timeStr.contains("ISO")) { 
     DateTimeFormatter dt = DateTimeFormat.forPattern("'ISO8601':yyyy-MM-dd'T'HH:mm:ssZ"); 
     DateTime tmp = dt.parseDateTime(timeStr); 
     this.datetime = toDateTime(getDate(), tmp.toString("HH:mm")); 
    } 
    this.datetime = toDateTime(getDate(), timeStr); 
    } 

    public String getDate() { 
    DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd"); 
    return this.datetime.toString(format); 
    } 

    public String getTime() { 
    DateTimeFormatter format = DateTimeFormat.forPattern("HH:mm"); 
    return this.datetime.toString(format); 
    } 

    private DateTime toDateTime(String dateStr, String timeStr) { 
    DateTimeFormatter fmt = ISODateTimeFormat.dateHourMinute(); 
    DateTime dt = fmt.parseDateTime(dateStr + "T" + timeStr); 
    return dt; 
    } 

私は、デバッガを介して実行すると、それが最初に呼ばれていたときのsetTimeが受け取るtimeStrパラメータが"780"です。私のyamlファイルには、次のようにモデルが挿入されているので、このような値はありません。

Booking(bobBooking): 
    date: 2011-09-16 
    time: 13:00 
    duration: 30 
    headcount: 10 
    room: b 
    user: bob 
    description: Bob's Booking. 

追加のフィールドは省略されています。

答えて

2

yamlファイルの時間値の引用符を使用してください。 (プレイでデフォルトです)SnakeYAMLパーサ(あなたが期待するものではありません)60進値として

+0

もちろん、私はそれがとても分かりやすいとは思えません!それで数日間苦労している。 – sw00

1

YAML 1.1定義13:00

http://yaml.org/type/int.html

使用を使用して、コロンフィールドを解析中に、いくつかの問題があるかもしれません文字列値を指定するための一重引用符または二重引用符。 ('13:00 '、 "13:00")

関連する問題