反面教師

もし以下のようなコードを書いてしまうと、#{exA.doSomething()}を呼んでも全く意味がなくなってしまいます。

@Stateless
@Name("exA")
public class ExampleABean implements ExampleA {

    @In
    @Out
    private ExampleEntity exEntity;

    @In
    private ExampleB exB;

    public String doSomething() {
        exB.doSomethingAtB();
        return viewId;
    }

}

@Stateless
@Name("exB")
public class ExampleBBean implements ExampleB {

    // Aと同じものをバイジェクト
    @In
    @Out
    private ExampleEntity exEntity;

    public void doSomethingAtB() {
        // exEntityを更新
    }
}

doSomethingAtBで行ったexEntityへの更新は呼び元のexA.doSomething()に戻る前にアウトジェクトされて一時的に反映されますが、exAにインジェクトされている値はdoSomething()呼び出し前の値なので、doSomething()のreturn時にその値をアウトジェクトして上書きします。