在springboot项目中有一个消息处理类,要在其中获取到httpSession,用@Autowired获取不到。publicclassTMessageHandlerFactoryimplementsMessageHandlerFactory{@AutowiredprivateHttpSessionsession;@Overridepublicvoiddata(InputStreamdata){intuserId=(int)session.getAtrribute("key");//这里的session为空....//插入数据}}如果用构造函数传过来也不行。@ComponentpublicclassSMTPRunnerimplementsApplicationRunner{@AutowiredprivateUserServiceuserService;//不明白为什么这个可以获取到@AutowiredprivateHttpSessionsession;//这个却不行@Overridepublicvoidrun(ApplicationArgumentsapplicationArguments)throwsException{TMessageHandlerFactorymyFactory=newTMessageHandlerFactory(session);....}}即使使用SpringBeanFacotryUtil(implementsApplicationContextAware)也不行。@ComponentpublicclassSpringBeanFactoryUtilimplementsApplicationContextAware{privatestaticApplicationContextapplicationContext;@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{if(SpringBeanFactoryUtil.applicationContext==null){SpringBeanFactoryUtil.applicationContext=applicationContext;}}//获取applicationContextpublicstaticApplicationContextgetApplicationContext(){returnapplicationContext;}//通过name获取Bean.publicstaticObjectgetBean(Stringname){returngetApplicationContext().getBean(name);}//通过class获取Bean.publicstaticTgetBean(Classclazz){returngetApplicationContext().getBean(clazz);}//通过name,以及Clazz返回指定的BeanpublicstaticTgetBean(Stringname,Classclazz){returngetApplicationContext().getBean(name,clazz);}}这种方法只能获取到自定义的bean(UserService这种),获取不到HttpSession这种Bean。应该如何做呢?可以给个比较详细的代码吗?网上的资料试了都不太行。
2 回答

手掌心
TA贡献1942条经验 获得超3个赞
//获取到当前线程绑定的请求对象HttpServletRequestrequest=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();//已经拿到session,就可以拿到session中保存的用户信息了。System.out.println(request.getSession().getAttribute("userInfo"));我猜楼主你是需要这个

慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
我发现其实不应该这样做,与session有关的操作,应该放在能获取到session的上下文中(如Controller中),而不应该放在一个单独的线程中,大概是因为项目的线程和context无关,所以线程中无法获取session。正确的做法应该是把和session有关的操作放到Controller中(或其他含有context的环境),再转移到线程进行处理。
添加回答
举报
0/150
提交
取消