Serialization Wicket行为中的不可序列化匹配器

Serialization Wicket行为中的不可序列化匹配器,serialization,wicket,matcher,hamcrest,Serialization,Wicket,Matcher,Hamcrest,我在Wicket上构建了一个可见性行为,它使用HamcrestMatcher(和一些Lambdaj)来查看给定的属性模型值是否与给定的Matcher匹配,如果匹配,那么它将隐藏组件 public class HiddenWhenValueMatchesBehavior<T> extends Behavior { private static final long serialVersionUID = 1L; Collection<IModel<T>>

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

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())));
  }
}
公共类HiddenWhenValueMatchesBehavior扩展行为{
私有静态最终长serialVersionUID=1L;
收集模型;
匹配器匹配器;
值匹配行为时的公共隐藏(匹配器匹配器、IModel…模型){
this.models=Arrays.asList(models);
this.matcher=matcher;
}
@凌驾
公共无效配置(组件){
超级配置(组件);
setVisible(!hasItem(matcher).matches(提取(models,on(IModel.class).getObject()));
}
}
直到那时,我才意识到Hamcrest Matchers是不可序列化的,根据他们的问题跟踪程序,他们根本不打算序列化

上面只是一个例子,我可以看到将
匹配器
传递到
行为
s和其他Wicket内容的几种用法


如何解决这个问题?

将匹配器包装在模型中:


public HiddenWhenValueMatchesBehavior(IModel>matcher,IModel…models){

将matcher包装在模型中:


public HiddenWhenValueMatchesBehavior(IModel>matcher,IModel…models){

将matcher标记为瞬态可能会有所帮助。但在行为反序列化后,您需要一种使此依赖项可用的方法。@SpringBean可以在使用Spring时自动执行此操作


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

将匹配器标记为瞬态会有所帮助。但是,您需要一种方法,在behavior被反序列化。@如果您使用Spring,SpringBean可以自动进行反序列化


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

顺便说一句,所有包含模型引用的对象都应该将其分离,这也适用于您的行为。顺便说一句持有对模型的引用应该将其分离,这也适用于您的行为。