40

Spring でショッピング カートを実装したいので、オブジェクトCart(products、paymentType、deliveryType などの属性を持つ) をセッションに保存する必要があります。Bean と属性「スコープ」を「セッション」に設定して作成しようとしましたが、うまくいきません。コントローラーまたはCartクラスで追加の注釈を使用する必要がありますか? 使用例は本当に役に立ちます:-) よろしくお願いします。

4

4 に答える 4

47
@Component
@Scope("session")
public class Cart { .. }

その後

@Inject
private Cart cart;

Web コンテキスト (dispatcher-servlet.xml) で宣言されている場合、動作するはずです。別のオプションは、生のセッションを使用して、そこにカート オブジェクトを配置することです。

@RequestMapping(..)
public String someControllerMethod(HttpSession session) {
    session.setAttribute(Constants.CART, new Cart());
    ...
    Cart cart = (Cart) session.getAttribute(Constants.CART);
}
于 2012-04-05T19:56:03.537 に答える
13

ショッピング カートをコントローラーに直接注入する場合、コントローラーがシングルトン スコープ (デフォルト) であり、注入する Bean よりも広いスコープであるため、問題が発生している可能性があります。この優れた記事では、まさにあなたがやろうとしていることに対する 4 つのアプローチの概要を説明しています: http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-include.html

解決策の簡単な要約は次のとおりです。

  1. コントローラーのスコープをセッション スコープに設定し (@scope("session")コントローラー レベルで使用)、コントローラーにショッピング カート インスタンスを配置します。
  2. コントローラーをスコープして要求し、セッション スコープのショッピング カートを挿入します。
  3. セッションを直接使用するだけです-ちょっと面倒です、IMO。
  4. Spring のアノテーションを使用し<aop:scoped-proxy/>ます。

すべての方法には長所と短所があります。私は通常、オプション 2 または 4 を使用します。オプション 4 は実際には非常に単純であり、Spring によって文書化されている唯一の方法です。

于 2012-04-05T20:12:13.100 に答える
3

HttpSession を自動配線しようとすると、Spring が HttpSession にプロキシを挿入します @Autowired private HttpSession httpSession;

于 2020-04-29T00:40:01.190 に答える