Springでショッピングカートを実装したいので、セッションでオブジェクトCart
(products、paymentType、deliveryTypeなどの属性を持つ)を保存する必要があります。 Beanと属性「scope」を「session」に設定して作成しようとしましたが、機能しません。コントローラーまたはCart
クラスで追加の注釈を使用する必要がありますか?使用例は本当に役に立ちます:-)よろしくお願いします。
@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")
を使用)、コントローラー内にショッピングカートインスタンスを作成します。<aop:scoped-proxy/>
。すべてのメソッドには長所と短所があります。私は通常、オプション2または4を使用します。オプション4は実際には非常に単純で、Springで文書化された 唯一のアプローチです。
セッションモードとプロキシモードで以下のようにスコープ注釈を追加するだけです
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class ShoppingCart implements Serializable{
}
ショッピングカートオブジェクトを使用する必要がある場合は、自動配線できます。
@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
Logger logger = LoggerFactory.getLogger(ShoppingCartServiceImpl.class);
@Autowired
ShoppingCart shoppingCart;
}
開示:Spring MVC、angularJS、およびbootstrapを使用してSpring Sessionスコープを示すサンプルプロジェクトを開発しました-
https://github.com/dpaani/springmvc-shoppingcart-sample