0

MatcherHamcrest (および一部の Lambdaj) を使用して、指定されたプロパティ モデル値のいずれかが指定されたマッチャーと一致するかどうかを確認し、一致する場合はコンポーネントを非表示にする、Wicket での可視性動作を構築していました。

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 Matcher はシリアライズ可能ではなく、Issue Tracker によると、シリアライズ可能にするつもりはないことに気付きました。

上記は単なる例です。s やその他の Wicketに渡すMatchersためのいくつかの使用法を見ることができます。Behavior

これを回避する方法はありますか?

4

2 に答える 2

2

マッチャーをモデルにラップします。

public HiddenWhenValueMatchesBehavior(IModel> マッチャー、IModel... モデル) {

于 2012-09-14T05:50:02.513 に答える
1

Matcher を一時的なものとしてマークすると役立ちます。ただし、動作が逆シリアル化された後にこの依存関係を利用できるようにする方法が必要です。Springを使用している場合、@SpringBeanはそれを自動的に行うことができます。

また

コンポーネントのモデル オブジェクトを LoadableDetachableModel にラップし、Matcher と一致するロジックをそこに移動して、Matcher を再び一時的にします。load メソッドは毎回 Matcher のインスタンスを作成し、モデル オブジェクトをロードできます。

于 2012-09-14T06:13:59.827 に答える