gpt4 book ai didi

java - 重写CompoundPropertyModel中对象的getter方法

转载 作者:行者123 更新时间:2023-12-02 03:30:06 25 4
gpt4 key购买 nike

以下是我在 Wicket 中使用CompoundPropertyModel 时经常遇到的问题的一个简单示例:

这是我的实体Item及其模型ItemModel和 Controller ItemController:

public class Item implements Serializable {

private static final long serialVersionUID = 1L;
private long createdTimestamp;

public Item(long createdTimestamp) {
super();
this.createdTimestamp = createdTimestamp;
}

public long getCreatedTimestamp() {
return createdTimestamp;
}

public void setCreatedTimestamp(long createdTimestamp) {
this.createdTimestamp = createdTimestamp;
}
}

public class ItemModel extends CompoundPropertyModel<Item> {

private static final long serialVersionUID = 1L;

public ItemModel(Item object) {
super(object);
}
}

public class ItemController {

public static int getDuration(Item item) {
return Days.daysBetween(new DateTime(item.getCreatedTimestamp()), new DateTime()).getDays();
}
}

假设我想在面板上显示createdTimestampduration。如果我做这样的事情:

public class ItemPanel extends GenericPanel<Item> {

private static final long serialVersionUID = 1L;

public ItemPanel(String id, ItemModel itemModel) {
super(id);
setModel(itemModel);
add(new Label("createdTimestamp"));
add(new Label("duration"));
}
}

Label createdTimestamp 将显示为长值,因为这是 getCreatedTimestamp() 方法返回的值,并且面板会抛出异常,因为没有 getDuration () 方法在 Item 类中实现。

一个可能的解决方案是为 Item 类创建一个包装器,可以将其称为 ItemView:

public class ItemView implements Serializable {

private static final long serialVersionUID = 1L;
private Item item;

public ItemView(Item item) {
super();
this.item = item;
}

public Date getCreatedTimestamp() {
return new Date(item.getCreatedTimestamp());
}

public int duration() {
return ItemController.getDuration(item);
}
}

它会起作用,但我不喜欢这个解决方案,因为如果您有很多实体并且它们有很多字段,那么为所有实体创建和使用包装类可能非常耗时。

Item 已经有包装器,称为 ItemModel。这就是为什么我想在此类中创建 getter 方法并强制模型使用它们。

以下是我的意思的示例:

public class ItemModel extends CompoundPropertyModel<Item> {

private static final long serialVersionUID = 1L;

public ItemModel(Item object) {
super(object);
}

public Date getCreatedTimestamp() {
return new Date(getObject().getCreatedTimestamp());
}

public int duration() {
return ItemController.getDuration(getObject());
}
}

但在这种情况下,模型将忽略 getter 方法。到目前为止,我还没有找到如何强制模型使用它们。有什么办法可以做到吗?

最佳答案

当组件和属性之间有直接映射时,CompoundPropertyModel 非常有用。但有时使用 AROM 更容易:

add(new Label("createdTimestamp", new AbstractReadOnlyModel<Date>() {
public Date getObject() {
return new Date(getModelObject().getCreatedTimestamp());
}
});

请注意,使用 Wicket 8,您可以写得更短:

add(new Label("createdTimestamp", () -> new Date(getModelObject().getCreatedTimestamp())));

(由于我们实际上只是从 Long 转换为 Date,因此最好使用转换器。)

Item has already wrapper, which is called ItemModel. That's why I would like to create getter methods in this class and force the model to use them

除了 IModel 中定义的方法之外,模型不应该有其他方法 - 您在其中添加的任何内容都不会被 Wicket 调用,但您最终会在组件之间产生不需要的依赖关系(例如您的面板需要 ItemModel 作为参数)。

creating and using wrapper classes for all of your entities can be very time consuming

我想知道为什么你要定义 ItemModel。最好在构造函数中接受任何模型:

public ItemPanel(String id, IModel<Item> itemModel) {
super(id, new CompoundPropertyModel<Item>(itemModel);
}

为什么调用者应该知道您的面板内部使用了CompoundPropertyModel?

跟进:
创建您自己的模型实现有合理的理由。看看随 Wicket 一起带来的那些:

  • 抽象只读模型
  • 可加载可拆卸模型
  • 资源模型
  • 字符串资源模型
  • ListItemModel
  • 属性模型
  • 复合属性模型
  • 反馈消息模型
  • Lambda模型
  • ...

它们都有存在的技术理由。您将根据自己的技术要求创建自己的模型实现,例如

new EntityModel(uuid, clazz)
new PropertyInYourGeneratedLegacyObjectModel(order, R.id.ORDER_NUMBER)

我见过其他我认为有问题的模型实现。以下两个通常有额外的方法,这些方法可能是某种错误的气味:

new TransactionalModel(wrapped).commit()
new AsyncModel(wrapped).startAsync()

人们提倡创建与您的领域相关的可重用模型 - 例如OrderSumModel - 但恕我直言,这失败了。领域逻辑迟早会包含在模型中,您将看到以下模式的出现:

BigDecimal sum = new OrderSumModel(order).getObject();

大多数时候,当我需要一些特殊的东西时,我只是编写匿名内部类:

new Label("sum", new AbstractReadOnlyModel() {
public BigDecimal getObject() {
return service.calculateSum(getModelObject());
}
});

如上所述,使用 Java 8 和 Wicket 8 这变得更容易编写:

new Label("sum", () -> service.calculateSum(getModelObject()));

一如既往,也有异常(exception):
当我需要具有复杂域逻辑的模型(例如 OrderSumModel)时,我将其保留为嵌套内部类。一旦我从多个位置需要它,我就会再次考虑。

关于java - 重写CompoundPropertyModel中对象的getter方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38228388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com