我在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内容的几种用法。
有什么方法吗?
答案 0 :(得分:2)
将匹配器包裹在模型中:
public HiddenWhenValueMatchesBehavior(IModel&gt; matcher,IModel ... models){
答案 1 :(得分:1)
将匹配器标记为瞬态可以提供帮助。但是,在对行为进行反序列化之后,您需要一种方法来使此依赖项可用。如果您使用Spring,@ SpringBean可以自动执行此操作。
或
将组件的模型对象包装到LoadableDetachableModel中,移动Matcher并将逻辑匹配到其中,再次使Matcher瞬态化。 load方法每次都可以创建Matcher的实例并加载模型对象。