1

アプリケーションに JSF Mojarra 2.1.13、PrimeFaces 3.5、および Spring 3.2.3 を使用しています。DI については、Spring アプローチを使用しています (CDI ではありません)。コレクターを使用した PrimeFaces デモのチュートリアルに従っています: http://www.primefaces.org/showcase/ui/collector.jsf

すべてが正常に機能しており、値をリストに追加したり、取得したりできます。問題は、たとえば、2 つのブラウザーを開いてリストにいくつかの値を追加すると、別のブラウザーで次のようにいくつかの値を追加することです。ブラウザを更新すると、両方のブラウザに入力されたすべての値が表示されます。そのため、1 つのブラウザーに 2 つの値を入力し、別のブラウザーに 2 つの値を入力すると、それらを更新した後、両方のブラウザーに 4 つの値が表示されます。私の価値観が異なるセッション間で共有されないようにしたい.

私の豆は次のようになります。

@Component
@ManagedBean
public class ClientBean extends BaseBean {

    private Client client = new Client();

    private List<Client> clients = new LinkedList<>();

    public String reInit() {
        client = new Client();
        return null;
    }

    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

    public List<Client> getClients() {
        return clients;
    }

    public void setClients(List<Client> clients) {
        this.clients = clients;
    }
}

私はグローバル変数を作成していることを知っています:

private Client client = new Client();    
private List<Client> clients = new LinkedList<>();

しかし、これはチュートリアルで示されています。では、これらの変数が異なるセッション間で共有されないように、この状況を処理してコレクターを機能させるにはどうすればよいでしょうか?

編集 Bean に次の注釈を付けようとしました:@RequestScopedまたは@SessionScoped- 機能しませんでした。同じ問題が残ります。

4

1 に答える 1

5

そもそも を@ManagedBeanとして構成した理由がよくわかりません。@Componentこの問題は、Spring がアプリケーション全体で の単一のインスタンスを処理するため@Componentです (または、少なくとも説明からはそのように見えます)。これを削除し@ViewScoped、マネージド Bean で使用して、これを期待どおりに機能させます。Spring を使用して JSF マネージド Bean を管理する場合は、faces-config.xmlにこの構成を追加する必要があることに注意してください( mkyong チュートリアルから)。

<application>
    <el-resolver>
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>
</application>

@ViewScopedただし、これを行うと、マネージド Beanの機能が失われます。このエラーを解決するには@ViewScoped、Spring で を実装する必要があります。これについてはネット上にたくさんの例があり、最も人気があるのはCagatay's のようです

JSF マネージド Bean スコープの詳細: Communication in JSF 2: Managed Bean スコープ

于 2013-06-24T14:58:15.757 に答える