Serialization Wicket行为中的不可序列化匹配器
我在Wicket上构建了一个可见性行为,它使用HamcrestSerialization 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>>
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方法可以每次创建匹配器实例并加载模型对象。顺便说一句,所有包含模型引用的对象都应该将其分离,这也适用于您的行为。顺便说一句持有对模型的引用应该将其分离,这也适用于您的行为。