在springboot项目中有一个消息处理类,要在其中获取到httpSession,用@Autowired获取不到。
public class TMessageHandlerFactory implements MessageHandlerFactory {
@Autowired
private HttpSession session;
@Override
public void data(InputStream data) {
int userId = (int)session.getAtrribute("key"); //这里的session为空
.... //插入数据
}
}
如果用构造函数传过来也不行。
@Component
public class SMTPRunner implements ApplicationRunner {
@Autowired
private UserService userService; //不明白为什么这个可以获取到
@Autowired
private HttpSession session; //这个却不行
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
TMessageHandlerFactory myFactory = new TMessageHandlerFactory(session);
....
}
}
即使使用SpringBeanFacotryUtil (implements ApplicationContextAware) 也不行。
@Component
public class SpringBeanFactoryUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringBeanFactoryUtil.applicationContext == null) {
SpringBeanFactoryUtil.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
这种方法只能获取到自定义的bean(UserService这种),获取不到HttpSession这种Bean。
应该如何做呢?可以给个比较详细的代码吗?网上的资料试了都不太行。
我发现其实不应该这样做,与session有关的操作,应该放在能获取到session的上下文中(如Controller中),而不应该放在一个单独的线程中,大概是因为项目的线程和context无关,所以线程中无法获取session。正确的做法应该是把和session有关的操作放到Controller中(或其他含有context的环境),再转移到线程进行处理。