3

EJB セッション Bean の例を試しています。それらの違いを見たいです。私の基本的なプロジェクトの図は以下のとおりです。

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

プロジェクトはショッピングカートのようなものです。マネージド Bean を呼び出して、追加された Urun オブジェクトの結果をインジェクトされた EJB 経由で取得する場合、結果リストは最後の Urun オブジェクトである必要があります。私の EJB は @Stateless Bean です。しかし、アプリケーションを実行すると、新しく追加されたすべての Urun オブジェクトが保持されます。しかし、それはステートレスであり、すべてのアクションで最後の Urun オブジェクトを保持する必要があります。そして、別の Web ブラウザでアプリケーション ページを開くと、追加前の Urun オブジェクトのリストが表示されます。しかし、マネージド Bean と EJB は私のモデルではステートレスです。ただし、Singleton 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>
4

1 に答える 1

5

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

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

呼び出し間でショッピング カートの状態を維持する必要がある場合は、ステートフル コンテキスト (たとえば、SessionWeb アプリケーションのコンテキスト) でそれを維持するか、EJB を としてマークする必要があります@Stateful

于 2012-05-03T21:46:34.413 に答える