java - 玩! framework bootstrap(Fixtures.loadModels ("initial-data.yaml)), injecting "random"模型 setter 中的字符串值

标签 java hibernate jpa persistence playframework

我有一个带有持久化 DateTime 字段的模型类,该字段仅通过 getters/setters 与 Transient 属性、String date;String time; 进行交互。执行一些非常具体的格式设置以创建将在需要时保留或检索的 DateTime 对象。

问题是,当我的模型从 yaml 文件加载时,time 字段的 setter 收到一个字符串值,该值与我的项目/代码中的任何内容都不对应。

这是只有相关成员的类:

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 文件中没有这样的值,因为模型是这样注入(inject)的:

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

省略了额外的字段。

最佳答案

尝试在 yaml 文件中对时间值使用引号。使用 SnakeYAML 解析器(这是 Play 中的默认设置)解析冒号字段时可能存在一些问题

关于java - 玩! framework bootstrap(Fixtures.loadModels ("initial-data.yaml)), injecting "random"模型 setter 中的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7431151/

相关文章:

java - W-shingling 实现 - 存储木瓦

java - 基于 BIRT 中的另一个表更改表值

java - volatile 保证可变对象的安全发布?

mysql - 在 JBoss 上部署时出现 C3P0ConnectionProvider 错误

java - 字段列表中的 JPA 未知列

java - 如何将一组类从 jar 库映射到 jpa 实体以创建数据库表

java - JPA 整洁架构

java - POST 方法在 Angular2 中不起作用

java - 如何检查mysql与eclipse的兼容性

java - 如何在注释中使用元素实现 idbag?