JSF2.2試してみた - 基本編のつづき

管理ビーンのデータの持ち方については、何とでもできるんだけど、個人的にはこうするのはイヤだった。

public class CalcView {
  private long left;
  private long right;
  private long answer;
    :
    // あとはそれらの getter/setter が続く
}

イヤな理由は管理ビーンがgetter/setterだらけになること。これに尽きる。

そうは言っても、管理ビーン画面単位で用意するなら、そこに登場するgetter/setterも、その画面(xhtml)に必要な分だけなので、もしかしたら許容範囲なのかもしれない。まかり間違って、複数の画面を束ねる管理ビーンだったりしたら、その画面分のgetter/setterがわんさと集まって、目も当てられない。

そんなわけで、データはデータであることがわかるように独立したオブジェクトにしといた。おっさん風に言えばDTO(Data Transfer Object)とかVO(Value Object)の類い。

ついで言えば、それらも

public class CalcView {
  private Calc calc;
  private List<Calc> results;
}

...とかしないで、CDIからインジェクションしてもらえば良いのかな?なんても思ったんだけど、

public class CalcView {
  @Inject   // <- これはイケる
  private Calc calc;
  @Inject   // <- こっちがあやしい
  private List<Calc> results;
}

ListみたいなコンテナオブジェクトをCDIでインジェクションする方法がイマイチわからんかった。今思えば、Producerを用意すればいいのかな?とも思うのだけれど、なんか大げさだし、気軽にCDI管理ビーンを増やしたら、CDIの名前が枯れそうなので、控えてた。
よく考えたら、インジェクションするだけなら、CalcがCDI管理ビーンである必要もないのか...とも。

CDIインジェクションで貫くとしたら、

@Named @RequestScoped
public class CalcView {
  @Inject
  private Calc calc;            // <- これは @RequestScoped
  @Inject
  private List<Calc> results;   // <- こっちは @ViewScoped
}

...ってやりたかったんだけど、@RequestScopedの管理ビーンに@ViewScopedの管理ビーンを貼り付けられなかった(...ような覚えがある。この辺、うろ覚え。


何にしてもCDI管理ビーンがgetter/setterだらけになるのは、たとえlombokがあったとしても好きじゃ無い。これは単なる好みの話。

っていうわけで、CDI管理ビーンのあるべき姿を探ってさまよう事になるのだけど、その話はまた今度。