0

我在 Wicket 上构建了一个可见性行为,它使用 Hamcrest Matcher(和一些 Lambdaj)来查看是否有任何给定的属性模型值与给定的匹配器匹配,如果是,那么它将隐藏组件。

public class HiddenWhenValueMatchesBehavior<T> extends Behavior {
  private static final long serialVersionUID = 1L;

  Collection<IModel<T>> models;
  Matcher<T> matcher;

  public HiddenWhenValueMatchesBehavior(Matcher<T> matcher, IModel<T>... models) {
    this.models = Arrays.<IModel<T>> asList(models);
    this.matcher = matcher;
  }

  @Override
  public void onConfigure(Component component) {
    super.onConfigure(component);
    component.setVisible(!hasItem(matcher).matches(extract(models, on(IModel.class).getObject())));
  }
}

直到那时我才意识到 Hamcrest Matchers 是不可序列化的,并且根据他们的问题跟踪器,他们无意序列化。

上面只是一个例子,我可以看到传递MatchersBehaviors 和其他 Wicket 东西的几种用途。

有什么办法吗?

4

2 回答 2

2

将匹配器包装在模型中:

公共 HiddenWhenValueMatchesBehavior(IModel> 匹配器,IModel... 模型){

于 2012-09-14T05:50:02.513 回答
1

将 Matcher 标记为瞬态会有所帮助。但是您需要一种方法来在行为反序列化后使这种依赖关系可用。如果您使用 Spring,@SpringBean 可以自动执行此操作。

或者

将组件的模型对象包装到 LoadableDetachableModel 中,将 Matcher 和匹配逻辑移入其中,再次使 Matcher 瞬态。load 方法可以每次创建 Matcher 的实例并加载模型对象。

于 2012-09-14T06:13:59.827 回答