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]
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。