【问题标题】:Wicket: set JodaDateTime from formWicket:从表单设置 JodaDateTime
【发布时间】:2014-10-08 14:51:53
【问题描述】:

我正在使用 wicket 和 hibernate 来开发网站。我只是想保存表单的一些数据。 我的对象是这样的:

@Entity
@Table(name = "PRODUCT")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DISCRIMINATOR",discriminatorType=DiscriminatorType.STRING )
@DiscriminatorValue(value="product")
public class Product implements Serializable {

@Id
@GeneratedValue
@Column(name = "PRODUCT_ID")
private int productID;

@Column(name = "START_DATE")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime startDate;

public DateTime getStartDate() {
    return startDate;
}

public void setStartDate(DateTime startDate) {
    this.startDate = startDate;
}
}

我得到了一个表单,该表单内部有几个输入字段。对于我使用的日期字段:

DatePicker datePicker = new DatePicker();
DateConverter dateConverter = new PatternDateConverter ( "dd.MM.yyyy", false );

final DateTextField startDate = new DateTextField("startDate",dateConverter);
startDate.add(datePicker);

如果我提交表单,我会收到此异常:

 Last cause: Could not convert value: 08.10.14 to type: org.joda.time.DateTime. Could not find     compatible converter.
WicketMessage: Method onFormSubmitted of interface     org.apache.wicket.markup.html.form.IFormSubmitListener targeted at [Form [Component id = form]] on     component [Form [Component id = form]] threw an exception

我猜是因为 wicket 使用 setter 作为 startDate。但是我该如何编辑呢?

【问题讨论】:

  • 您的表单是否使用CompoundPropertyModel?如果为真,那么我认为它会尝试将Date 转换为DateTime,但它失败了。尝试为您的DateTextField(例如new PropertyModel<Date>(this,"customDate"))使用自定义模型以使用Date 对象存储实际值,并在提交表单时-> 将customDate 转换为DateTime 对象并设置为Product
  • 在存储DateTextField 时,我使用@Temporal(TemporalType.TIMESTAMP) 而不是@Type,然后我使用Date 对象private Date startDate;。也可以将TemporalType设置为Date
  • 嘿,我想我意识到我还没有完全理解模型。正如@Michael 所说,我在 DateTextField 中添加了一个日期模型。

标签: java forms hibernate wicket


【解决方案1】:

如果您的表单使用CompoundPropertyModel,那么表单组件将搜索真实模型对象的对应字段,以将值应用于(wicket:表单组件的id必须等于模型字段的名称此字段的类型必须与表单组件返回的类型相同)。

但是如果模型中没有对应的字段,或者我们想使用独立的表单组件,那么我们只需要为该组件使用另一个模型。

您的异常出现是因为DateTextField 在转换后返回Date 并且您的模型具有DateTime 字段。

所以,你至少有两种方法来处理这个问题:

  1. 在我的评论中描述了对该字段使用自定义模型并将Date 值(通过onSubmit 方法从表单组件中获取)转换为DateTime 对象。
  2. 但是,我认为最好使用您自己的转换器。您可以强制您的 DateTextField 为您的模型返回 DateTime 对象。查看 herehere(请参阅 src 中的 URL TextField)以更好地了解如何实现这一目标。您可以根据org.apache.wicket.datetime.DateConverter src 实现自己的转换器。

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2016-07-07
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多