簡體   English   中英

玩! 框架bootstrap(Fixtures.loadModels(“ initial-data.yaml)),在模型的setter中注入“ random”字符串值

[英]Play! framework bootstrap(Fixtures.loadModels(“initial-data.yaml)), injecting ”random" String value in model's setter

我有一個帶有持久化DateTime字段的模型類,該類僅通過用於臨時屬性( String date; getter / setter進行交互String date; String time; 執行一些非常特定的格式來創建DateTime對象,該對象將在需要時被保留或檢索。

問題是,當從yaml文件加載模型時, time字段的setter接收到的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.

省略其他字段。

嘗試對Yaml文件中的時間值使用引號。 使用SnakeYAML解析器解析冒號字段時可能會出現問題(這是Play中的默認設置)

YAML 1.1將13:00定義為十六進制值(這不是您期望的值)

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

使用單引號或雙引號指定字符串值。 (“ 13:00”,“ 13:00”)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM