Wicket行为中的非序列化匹配器

时间:2012-09-14 04:31:02

标签: serialization wicket matcher hamcrest

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

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不是可序列化的,根据他们的问题跟踪器,他们无意进行序列化。

上面只是一个例子,我可以看到将Matchers传递给Behavior和其他Wicket内容的几种用法。

有什么方法吗?

2 个答案:

答案 0 :(得分:2)

将匹配器包裹在模型中:

public HiddenWhenValueMatchesBehavior(IModel&gt; matcher,IModel ... models){

答案 1 :(得分:1)

将匹配器标记为瞬态可以提供帮助。但是,在对行为进行反序列化之后,您需要一种方法来使此依赖项可用。如果您使用Spring,@ SpringBean可以自动执行此操作。

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