🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

6352閲覧

SpringBootのsession管理がうまく動かない

tsizuku

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/02/13 00:22

SpringBootでsession変数を使ってクラス間のデータデータの受け渡しをしたいと
試みています。例えば
画面A⇒submit⇒Actionクラスでデータをセット⇒画面B表示⇒B画面のActionでそれを受け取る。
画面起動時に異常終了してしまいます。その場所は、画面Aのアクションクラスでsession用のDTOを生成するところです。
サンプルソースが少なく、正直これで合っているのか?
また、そもそもズレた実装をしていて「javax.servlet.http.HttpSession」を使った実装が一般的なのか、分からず教えてください。

◆環境
Spring Tool Suite 4 Version: 4.8.1
SpringBoot2
Java8

◆sessionDto

import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.io.Serializable; import java.util.List; @Component @Scope(value= "session") public class SessionDto implements Serializable { private static final long serialVersionUID = 1L; /** * ログイン中ユーザ情報 */ public String loginInfo; public String command = ""; public String viewMode; public String getCommand() { return command; } public String getViewMode() { return viewMode; } }

◆Actionクラス(画面Aのsubmit)

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.beans.factory.annotation.Value; import javax.servlet.http.HttpServletRequest; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import jp.psf.shoryu.dto.system.SessionDto; @Controller public class LoginAction { @Autowired SessionDto sessiondto; // ★ @RequestMapping(value = "/login", method = RequestMethod.GET) public String LoginSubmit(HttpServletRequest request, ModelAndView mav) { Logger logger = LogManager.getLogger(LoginAction.class); logger.debug("テスト用ログです"); sessiondto.viewMode = "edit"; return "/master/nextscreen"; } @RequestMapping(value = "/", method = RequestMethod.GET) public ModelAndView index2(ModelAndView mav) { mav.setViewName("index"); return mav; } }

起動時、★の部分で異常終了します。

◆エラー情報

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginAction': Unsatisfied dependency expressed through field 'sessiondto'; nested exception is org.springframework.beans.factory.support.ScopeNotActiveException: Error creating bean with name 'sessionDto': Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.3.3.jar:5.3.3]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

下記のように書き換えて解決しました。
@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
有難うございました。

投稿2021/02/13 13:25

tsizuku

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「javax.servlet.http.HttpSession」を使った実装が一般的なのか

別にそれでもできないことはないでしょうけど(結局Spring自体がサーブレットをラップしているようですし)
Springには付随するAPIが沢山あるので、適宜それを使うのが良いかと思います。
Spring Session
Spring Security

投稿2021/02/13 00:25

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsizuku

2021/02/13 09:43

有難うございます。 質問欄のコードでは、何が問題でしょうか?
m.ts10806

2021/02/13 10:00 編集

「下手に自作するくらいなら、提供されてる機能を使った方が安全で実装も楽」というのが本回答の主旨です。なので、申し訳ないのですがエラー除いてほとんどコード読んでいません。
tsizuku

2021/02/13 11:48

承知しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問