-1

私が知りたかったのは、EJB Bean 内でマネージド Bean を呼び出すオプションはありますか。次のコードがあると想像してください。

@ManagedBean
@SessionScoped
public class MyManagedBean implements Serializable {
  public String getUrl() {
      return "http://www.google.com";
  }
}

@Stateless
public class MyEJB {

  @ManagedProperty(value = "#{myManagedBean}")
  MyManagedBean myManagedBean;

  public void setMyManagedBean(MyManagedBean myManagedBean) {
      this.myManagedBean = myManagedBean;
  }

  public void call() {
      // NullPointerException here
      System.out.println(myManagedBean.getUrl());         
  }
}

私もこれを試しました:

@Stateless
public class MyEJB {
  @EJB
  MyManagedBean myManagedBean;
  ...
}

...しかし、別のMyManagedBeanインスタンスを返します。

4

1 に答える 1

3

これは正しくないです。JSF マネージド Bean の代わりに CDI マネージド Bean を使用すれば可能ですが、設計が悪いため、正しくありません。ビジネス サービスは、フロントエンドをまったく認識しないようにする必要があります。これにより、JSF 以外のフロントエンドでビジネス サービスを再利用できなくなります。

逆にやるべきです。その逆ではなく、マネージド Bean に EJB を注入する必要があります。EJB は完全にステートレスに保つ必要があります。メソッド引数として必要な情報を EJB に直接渡す必要があります (後で EJB のインスタンス変数として割り当てないでください)。

例えば

@ManagedBean
@SessionScoped // <-- Did you read https://stackoverflow.com/q/7031885?
public class MyManagedBean implements Serializable {

    private String url = "http://www.google.com";

    @EJB
    private MyEJB myEJB;

    public void submit() {
        myEJB.call(url);
    }

    public String getUrl() {
        return url;
    }

}

@Stateless
public class MyEJB {

    public void call(String url) {
        // No NullPointerException here.
        System.out.println(url);
    }

}

以下も参照してください。

于 2013-09-26T11:40:34.843 に答える