当前位置: 首页 > 知识库问答 >
问题:

当架构更新时,作用域“session”对当前线程不是活动的

皮献
2023-03-14
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class PreferredDatabaseSession implements Serializable {

private DatabaseEnvironment preferredDb;

public DatabaseEnvironment getPreferredDb() {
    return preferredDb;
}

public void setPreferredDb(DatabaseEnvironment preferredDb) {
    this.preferredDb = preferredDb;
}

}

我把它叫做:

public class DataSourceRouter extends AbstractRoutingDataSource {

    @Autowired
    private PreferredDatabaseSession db;

    @Override
    protected Object determineCurrentLookupKey() {
    return db.getPreferredDb();
    }
}

也从这里打电话:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

@Autowired
private PreferredDatabaseSession userDatabaseSession;

private void setPreferredDatabase() throws DataAccessException {
    // String preferredDb = (String) request.getSession().getAttribute("preferredDb");
    String preferredDb = request.getParameter("preferredDb");
    if (preferredDb.equals(Constants.JPLATFORM)) {
        userDatabaseSession.setPreferredDb(DatabaseEnvironment.JPLATFORM);
    } else if (preferredDb.equals(Constants.TIGER)) {
        userDatabaseSession.setPreferredDb(DatabaseEnvironment.TIGER);
    }
}
}

共有1个答案

宗项禹
2023-03-14

UserDetailsServiceImpl是一个单例bean,但HttpServletRequest是一个请求范围bean,这就是异常的原因。

尝试使用

ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = requestAttributes.getRequest();

而不是自动调用HttpServletRequest

@Override
protected Object determineCurrentLookupKey() {
if (RequestContextHolder.getRequestAttributes() == null) {
    return DEFAULT_ONE;
}
return db.getPreferredDb();
}
 类似资料:
  • 当批处理在服务器启动时运行时不会出现上述异常。但只有在24小时后调用批处理时才会发生。为什么会这样?如果出现异常,那么即使批处理在(IBM websphere)服务器启动时运行,也应该出现异常。为什么会话在服务器启动时可用,甚至在应用程序完全启动之前,没有人使用它? 在我们将bean定义为会话/请求范围的地方,但我们在服务器启动期间使用这些beans(还没有发出会话或请求),为什么spring不会

  • null 这个错误的原因是什么,难道我们不能有2@ControllerAdvice注释类吗?当我在RegistrationBaseController.java中注释@ControllerAdvice时,它执行得很好。

  • 我试图在Spring Framework 4.2.3上使用Spring Security 3.2.5的Spring Boot 1.3.0应用程序中实现OpenId Connect登录。实现与以下问题非常相似:用oauth2保护REST API:Error创建名为'scopedtarget.oauth2ClientContext'的bean:Scope'session'不是活动的,除了我为实现了建议

  • 为了在请求、会话和全局会话级别支持bean的范围(Web范围bean),在定义bean之前需要进行一些次要的初始配置。 我在中添加了以下内容,如文档所示: 2.将bean限定为依赖项 org.springframework.beans.factory.BeanCreationException:创建名为“ScopedTarget.ReportBuilder”的bean时出错:当前线程的作用域“se

  • 当前线程的作用域“请求”未处于活动状态;如果您想从一个单体引用它,请考虑为这个bean定义一个作用域代理;嵌套的异常是java。lang.IllegalStateException:未找到线程绑定请求:您是指实际web请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上在web请求中操作,并且仍然收到此消息,那么您的代码可能在DispatcherServlet/DispatcherPo

  • 在我的Spring批处理配置中,我试图设置一个分区步骤,该步骤访问JobParameters中的值,如下所示: 我已经将@EnableBatchProcessing注释添加到我的SpringBoot应用程序中。 但是如果我在partitionStep上使用StepScope注释,我会得到 创建名为“ScopedTarget.PartitionStep”的bean时出错:当前线程的作用域“step”