web-dev-qa-db-ja.com

セッション中のSpringストアオブジェクト

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

28
tomaszf
@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);
}
33
Bozho

ショッピングカートをコントローラーに直接注入する場合、コントローラーがシングルトンスコープ(デフォルト)であるため、注入する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で文書化された 唯一のアプローチです。

13
stephen.hanson

セッションモードとプロキシモードで以下のようにスコープ注釈を追加するだけです

@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

2