質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

4682閲覧

【SpringFramework】複数Controllerの場合、同じController内でしかsessionが保持されない

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

1クリップ

投稿2018/09/14 07:15

編集2018/09/14 09:27

前提・実現したいこと

いつもお世話になっております。

複数Controllerでsessionに保存した値の取得をしたいです。
現在、sessionスコープのbeanを使用してsessionの持ち回りをしています。以下を参考にさせていただきました。
4.4.2.2.1. sessionスコープのBean定義

発生している問題・エラーメッセージ

同じController内では値が取得できますが、他のControllerで取得をするとnullが返ってきます。

該当のソースコード(Sample)

簡単に記載しますが、分かりづらければ修正いたしますので、仰ってください。

Java

1 2// sessionスコープのbean 3 4@Component 5@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 6public class SessionBean implements Serializable { 7 8 private static final long serialVersionUID = 1L; 9 10 private String loginCode; 11 12 public void setLoginCode(String loginCode) { 13 this.loginCode = loginCode; 14 } 15 16 public String getLoginCode() { 17 return loginCode; 18 } 19}

Java

1 2// コントローラA 3 4@Controller 5public class LoginController { 6 7 @Autowired 8 private SessionBean session; 9 10 @RequestMapping(value = "menu", method = POST) 11 public String testA(){ 12  session.setLoginCode(loginForm.getCode()); 13 14  // ここでSystem.out.println(session.getLoginCode())を実行すると、正しく値が出力される 15 16  return "menu/menu"; 17 } 18}

Java

1 2// コントローラB 3 4@Controller 5public class MenuController { 6 7 @Autowired 8 private SessionBean session; 9 10 @RequestMapping(value = "input", method = POST) 11 public String okButtonPush(){ 12 System.out.println(session.getLoginCode());nullが出力されてしまう 13 } 14 15 return "ok"; 16}

<mvc-config追記>

<context:component-scan base-package="jp.co.daicho" /> <mvc:annotation-driven />

試したこと

1.上記サイトだけでなく他の方のサイトいくつかも参考に見直しを行いました
2.sessionBeanはパッケージを分けているので、同じパッケージに移してみました
3.アクセス範囲を、いったん全てprivate⇒publicにしてみました
(全てダメでした;;;)

補足情報(FW/ツールのバージョンなど)

Java8
STS 3.9.6

よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/09/14 08:10

コントローラーはシングルトンだからコントローラー生成時の生成者の情報が設定されるんじゃ
退会済みユーザー

退会済みユーザー

2018/09/14 08:21

asahina1979様 ご回答ありがとうございます。理解ができなくて申し訳ないのですが、「コントローラ生成時の生産者の情報が設定される」とはどういう意味でしょうか。違っていたらすみませんが、「コントローラ生成時の生産者の情報が設定される」から「nullになる」ということでしょうか。(初心者マークつけるべきでした。)
退会済みユーザー

退会済みユーザー

2018/09/14 08:22

もし、「コントローラ生成時の生産者の情報が設定される」から「nullになる」のであれば、複数Controllerでのセッション共有はそもそも無理だと思うのですが、そういう意味でしょうか。。。
退会済みユーザー

退会済みユーザー

2018/09/14 08:34

あと 4.4.2.1 よもう
退会済みユーザー

退会済みユーザー

2018/09/14 08:42

ありがとうございます。貼っていただいたjavadocと、4.4.2.1を再確認して、動かしてみましたが、@SessionAttributeは同一Controller内でしか、保持できませんでした。。4.4.2.1の記述で「@SessionAttributesアノテーションは、Controller内で行われる画面遷移において、データを持ち回る場合に使用する。」とあり、4.4.2.2では「Spring FrameworkのsessionスコープのBeanは、 複数のControllerをまたいだ画面遷移において、データを持ち回る場合に使用する。」とあります。ここで使い方が変わってくるかと思ってsessionスコープのbeanを使っていたのですが。。。もう少し、いろいろ動かしてみます。
guest

回答2

0

当方、springフレームワークからは随分長く離れていた、かつ、springがだいぶバージョンアップしているため、正しい回答ができるか自信がありません。。
そのうえでわかる範囲で気付いた点を回答します。

SessionBeanをインジェクトしている宣言部分ですが、ayaaa様が参考にされているサイトの説明では「@Autowired」アノテーションではなく「@Inject」を使うように記述があります。ここを変えてみては如何でしょうか?

また、struts系のフレームワークで大事なのは設定ファイルです。
設定ファイルの設定を提示することでより多くの回答が得られるかもです。

投稿2018/09/14 08:40

SE-studying-now

総合スコア351

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

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

退会済みユーザー

退会済みユーザー

2018/09/14 08:44

SE-studying-now様 ご回答ありがとうございます。 >「@Autowired」アノテーションではなく「@Inject」 自分では、全然気が付きませんでした。。。ありがとうございます。これからやってみます!
退会済みユーザー

退会済みユーザー

2018/09/14 08:45

設定ファイルも、これから追記します。ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/09/14 09:28

試してみたのですが、できませんでした、、、。 http://arakan-pgm-ai.hatenablog.com/entry/2017/03/24/194503 こちらのサイトも、参考にしたのですが、やはりできません。。 mvc-configの記載を追加しました。 ご助言ありがとうございます。
guest

0

ベストアンサー

原因の追究はできていませんが、問題は解消しました。私のミスでした。
起動時の画面を表示する際に、beanクラスのインスタンス生成をしていました(初期化のためと思って実装していました)が、Controllerクラス外に出したところ、正しく保持ができるようになりました。

asahina1979様、SE-studying-now様、
つたない質問にご回答いただきまして、本当にありがとうございました。

投稿2018/09/14 09:51

編集2018/09/18 02:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問