2012-05-03 13 views
3

EJBセッションBeanの例を試してみましょう。私はそれらの違いを見たいと思います。私の基本的なプロジェクトの図は以下の通りです。@Stateless Session Beanは@Singleton Beanとして動作します

http://img109.imageshack.us/img109/8262/85220418.png

プロジェクトは、ショッピングカートのようなものです。注入されたEJBを介して追加されたUrunオブジェクトの結果を取得するためにマネージドBeanに呼び出すとき、結果リストは最後のUrunオブジェクトでなければなりません。なぜなら、私のEJBは@Stateless beanだからです。しかし、私はアプリケーションを実行すると、すべての新しいUrunオブジェクトが追加されたままになります。しかし、ステートレスなので、すべてのアクションで最後のUrunオブジェクトを保持する必要があります。そして、他のWebブラウザでアプリケーションページを開くと、以前に追加されたUrunオブジェクトのリストが一覧表示されます。しかし、マネージドBeanとEjbは私のモデルではStatelessです。しかし、それはシングルトンBeanとして機能します。私の問題はどこですか?

@Stateless 
public class AlisverisSepetiEJB { 

    List<Urun> urunler=new ArrayList<>(); 

    public List<Urun> getUrunler() { 
     return urunler; 
    } 

    public void setUrunler(List<Urun> urunler) { 
     this.urunler = urunler; 
    } 

    public void urunEkle(Urun urun){ 
     urunler.add(urun); 
    } 

} 

@ManagedBean(name="bean") 
@RequestScoped 
public class JSFYonetimliNesne { 

    public JSFYonetimliNesne(){ 
     System.out.println("Yönetimli nesne çalıştı"); 
    } 

    @EJB 
    AlisverisSepetiEJB alisverisSepeti; 

    Urun urun=new Urun(); 
    List<Urun> urunler; 


    public List<Urun> getUrunler() { 
     return alisverisSepeti.getUrunler(); 
    } 

    public void setUrunler(List<Urun> urunler) { 
     this.urunler = urunler; 
    } 

    public Urun getUrun() { 
     return urun; 
    } 

    public void setUrun(Urun urun) { 
     this.urun = urun; 
    } 

    public void sepeteKoy(){ 
     alisverisSepeti.urunEkle(urun); 
     urun=new Urun(); 
    } 

} 

public class Urun { 

    String urunAdi; 
    Long fiyat; 
    Long gramaj; 

    public Long getFiyat() { 
     return fiyat; 
    } 

    public void setFiyat(Long fiyat) { 
     this.fiyat = fiyat; 
    } 

    public Long getGramaj() { 
     return gramaj; 
    } 

    public void setGramaj(Long gramaj) { 
     this.gramaj = gramaj; 
    } 

    public String getUrunAdi() { 
     return urunAdi; 
    } 

    public void setUrunAdi(String urunAdi) { 
     this.urunAdi = urunAdi; 
    } 

} 

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
    <h:head> 
     <title>Alışveriş Sepeti</title> 
    </h:head> 
    <h:body> 
     Alışveriş Sepeti 
     <h:form> 

      <h:panelGrid columns="2"> 
      <h:outputLabel value="Ürün adı : "/> 
      <h:inputText value="#{bean.urun.urunAdi}"/> 
      <h:outputLabel value="Ürün fiyatı : "/> 
      <h:inputText value="#{bean.urun.fiyat}"/> 
      <h:outputLabel value="ÜRün gramajı : "/> 
      <h:inputText value="#{bean.urun.gramaj}"/> 
      </h:panelGrid> 

      <h:commandButton action="#{bean.sepeteKoy}" value="Sepete Ekle"/> 

      <br><h:outputLabel value="Sepetteki Ürünler"/></br> 


      <h:dataTable value="#{bean.urunler}" var="item" border="1"> 

      <h:column > 
       <f:facet name="header"> 
        <h:outputLabel value="Ürün adı"/> 
       </f:facet> 
      <h:outputText value="#{item.urunAdi}"/> 
      </h:column> 

      <h:column > 
       <f:facet name="header"> 
        <h:outputLabel value="Ürün fiyatı"/> 
       </f:facet> 
      <h:outputText value="#{item.fiyat}"/> 
      </h:column> 

      <h:column > 
       <f:facet name="header"> 
        <h:outputLabel value="Ürün gramajı"/> 
       </f:facet> 
      <h:outputText value="#{item.gramaj}"/> 
      </h:column> 

      </h:dataTable> 

     </h:form> 

    </h:body> 
</html> 
+2

SOに掲載する際に、ローカライズされたソースコードを投稿しないでください。 –

答えて

5

それは(コンテナはこれを行うことができ、それは完全に合法だ)AlisverisSepetiEJBの同じインスタンスが呼び出し間で共有されていることはかなり可能です。 @Stateless EJBのステートレスな性質のために、ではなく、にインスタンス属性を宣言する必要があります。

List<Urun> urunler = new ArrayList<>();宣言とすべての関連メソッドを削除して、ステートレスBeanはすべてのメソッドが静的であると考えます。つまり、インスタンス属性を使用できず、インスタンスデータとは完全に独立している必要があります。呼び出しの間に状態を維持する必要がある場合は、EJBが呼び出されているポイントからパラメータとして渡す必要があります。 @Stateless EJBで許可される唯一のインスタンス変数は、それ自身がステートレスおよび/または不変である属性です。

ショッピングカートの状態を呼び出し間で維持する必要がある場合は、ステートフルなコンテキスト(たとえば、WebアプリケーションのSessionコンテキスト)のどこか別の場所に保存するか、EJBを@Statefulとマークする必要があります。

+2

合意。 @Stateless Beanにいくつかのメンバ変数がある場合、「状態」情報を含まないEntityManagerのようなものでなければなりません。 – toto2

+1

ステートレスBeanには、ユーザーの観察可能な状態を除いて、すべての種類の状態が含まれる場合があります。したがって、entitymanagerは、キャッシュやパフォーマンスの最適化として内部的に使用されている限り、何かへの接続などはすべて問題ありません。 –

関連する問題