2012-04-05 6 views
24

私はSpringでショッピングカートを実装したいので、セッション中に製品(製品、paymentType、およびdeliveryTypeのような属性を持つ)を保存する必要があります。私はBeanで属性を作成しようとしましたが、 "scope"が "session"に設定されていましたが、コントローラやCartクラスで追加の注釈を使用するとうまくいきません。どのような使用例が本当に役に立つでしょう:-)事前に感謝します。セッション中のSpringストアオブジェクト

答えて

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

、その後

@Inject 
private Cart cart; 

それはWebコンテキスト(ディスパッチャ-servlet.xml)で宣言されている場合、動作するはずです。あなたのコントローラに直接ショッピングカートを注入している場合は、あなたのコントローラーが(デフォルトで)シングルトンスコープですので、問題はおそらく起こっている

@RequestMapping(..) 
public String someControllerMethod(HttpSession session) { 
    session.addAttribute(Constants.CART, new Cart(); 
    ... 
    Cart cart = (Cart) session.getAttribute(Constants.CART); 
} 
+0

はい、「代替オプション」は動作しますが、私はそれを使用したくありません。自分のコントローラーで私有の属性カートを作成すると、「一致するBeanが依存関係に見つかりませんでしたこの依存関係のautowire候補となるBean。依存関係の注釈:{@ org.springframework.beans.factory.annotation.Autowired(required = true)} "。? – tomaszf

+1

いいえ、dispatcher-servlet.xml。または、私が示したように、注釈 – Bozho

+0

Hmmで宣言されていますが、注釈を使用すると、dispatcher-servlet.xmlにBean定義なしで、注釈を使用してBeanを定義すると、コントローラでのみ404が得られます。 – tomaszf

13

を:代替オプションは、生のセッションを使用し、そこにあなたのカートオブジェクトを置くことですこれは注入しているBeanよりも広い範囲です。この優秀な記事は、あなたがしようとしていることを正確に示す4つのアプローチの概要を示しています:http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html

は、ここでのソリューションの簡単な要約です:

  1. 範囲セッションスコープ(コントローラレベルでの使用@scope("session"))にコントローラとちょうどコントローラでのショッピングカートのインスタンスを持っています。
  2. コントローラが要求し、セッションスコープのショッピングカートを挿入する範囲を指定します。
  3. ちょうど直接セッションを使用してください - 一種の乱雑なIMO。
  4. Springの注釈<aop:scoped-proxy/>を使用してください。

すべての方法に賛否両論があります。私は通常

@Component 
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS) 
public class ShoppingCart implements Serializable{ 
} 

セッションとプロキシモードであなただけの、次のようにスコープ注釈を追加する必要があり、私は documented by Spring.

+0

正しいURLはhttp:// richardchesterwoodです。 blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html – Gilead

+0

ありがとう@Gilead。私は正しいURLで更新しました。 –

+0

解決策#4では、どのメソッドでもfinalを使用しないでください。そうすることで、アクセサーはシングルトンになります。セッションスコープではなく、AOPはファイナルを傍受できません。 –

2

を見てきました実際には非常にシンプルであり、唯一のアプローチですオプション2または4オ​​プション4で行きます -
私は春のSessionスコープを示し、スプリングMVC、angularJSとブートストラップを使用するサンプルプロジェクトを、開発している:これまであなたがショッピングカートオブジェクトを使用する必要がある、あなたはそれを

@Service 
public class ShoppingCartServiceImpl implements ShoppingCartService { 
    Logger logger = LoggerFactory.getLogger(ShoppingCartServiceImpl.class); 


    @Autowired 
    ShoppingCart shoppingCart; 
} 

開示をautowireすることができますhttps://github.com/dpaani/springmvc-shoppingcart-sample

関連する問題