gpt4 book ai didi

spring - 如何从 Spring Boot 中的公共(public)类中获取 session ?

转载 作者:行者123 更新时间:2023-12-03 14:18:23 27 4
gpt4 key购买 nike

我想从普通类(class)中获得 session 。使用 @Autowired没用。

public class TMessageHandlerFactory implements MessageHandlerFactory {

@Autowired
private HttpSession session;

@Override
public void data(InputStream data) {
int userId = (int)session.getAtrribute("key"); //session null
.... //do sth
}
}

构造函数也没有工作
@Component
public class SMTPRunner implements ApplicationRunner {

@Autowired
private UserService userService; // userService can access

@Autowired
private HttpSession session; // session can't access

@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
TMessageHandlerFactory myFactory = new TMessageHandlerFactory(session);
....
}
}

我也尝试使用 SpringBeanFactory ,它也没有工作。
@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;
}
}

public static ApplicationContext getApplicationContext() {
return applicationContext;
}

public static Object getBean(String name){
return getApplicationContext().getBean(name);
}

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);
}
}
SpringBeanFactoryUtil只能获取我的自定义 bean,无法获取 HttpSession .
我该怎么办?

最佳答案

如果我理解正确,您想从范围更广(单例)的组件访问 session 范围内的某些内容,因此系统无法知道您实际上对服务器中的哪个潜在并发 session 感兴趣它会在 Spring 初始化时说未定义 session 范围。
您可以使用 ObjectFactory 模式来解决这个问题(可能的解决方案之一)

import `org.springframework.beans.factory.ObjectFactory`;
// ...
// ...

@Autowired
ObjectFactory<HttpSession> httpSessionFactory;
然后当你需要它时,从绑定(bind)到 session 的线程中:
HttpSession session = httpSessionFactory.getObject();
这样,spring 绑定(bind)一个收据,以获取您调用 getObject() 方法的类型所需的对象,而不是尚不可用的实际对象。
请理解,如果在运行代码时没有 session 绑定(bind)到当前线程,这将失败(返回 null),因为没有可用的 session 。这意味着您要么从未能转发请求/ session 的请求线程本地信息的线程中调用此代码,要么从没有意义的上下文中调用此代码。

关于spring - 如何从 Spring Boot 中的公共(public)类中获取 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48488735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com