Spring でショッピング カートを実装したいので、オブジェクトCart
(products、paymentType、deliveryType などの属性を持つ) をセッションに保存する必要があります。Bean と属性「スコープ」を「セッション」に設定して作成しようとしましたが、うまくいきません。コントローラーまたはCart
クラスで追加の注釈を使用する必要がありますか? 使用例は本当に役に立ちます:-) よろしくお願いします。
4 に答える
@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);
}
ショッピング カートをコントローラーに直接注入する場合、コントローラーがシングルトン スコープ (デフォルト) であり、注入する Bean よりも広いスコープであるため、問題が発生している可能性があります。この優れた記事では、まさにあなたがやろうとしていることに対する 4 つのアプローチの概要を説明しています: http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-include.html。
解決策の簡単な要約は次のとおりです。
- コントローラーのスコープをセッション スコープに設定し (
@scope("session")
コントローラー レベルで使用)、コントローラーにショッピング カート インスタンスを配置します。 - コントローラーをスコープして要求し、セッション スコープのショッピング カートを挿入します。
- セッションを直接使用するだけです-ちょっと面倒です、IMO。
- Spring のアノテーションを使用し
<aop:scoped-proxy/>
ます。
すべての方法には長所と短所があります。私は通常、オプション 2 または 4 を使用します。オプション 4 は実際には非常に単純であり、Spring によって文書化されている唯一の方法です。
HttpSession を自動配線しようとすると、Spring が HttpSession にプロキシを挿入します
@Autowired
private HttpSession httpSession;