You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Controller注入SessionScope bean设置属性不生效问题

问题根因与解决方案

1. getter/setter不符合JavaBean规范导致属性设置不生效

你的LdapUser类中shortname属性的读写方法命名不符合Java标准Bean规范:

  • 原方法命名为getshortname()、setshortname(),正确命名应该为getShortname()、setShortname()(属性名首字母大写)。
    Spring用于会话域Bean的CGLIB动态代理,会基于JavaBean命名规则匹配方法与对应属性,不符合规范的方法无法被正确代理到实际绑定会话的目标Bean实例,因此会出现调用set方法后属性值未更新的现象。你需要修正所有属性的get/set方法命名,使其符合规范。

2. 多次创建Bean实例的原因

你配置的proxyMode = ScopedProxyMode.TARGET_CLASS已经正确支持单例Controller注入会话域Bean,注入到单例Bean本身不是问题,多次创建实例通常是以下两个原因:

  • 客户端请求未携带有效会话标识:检查请求是否携带JSESSIONID Cookie,或是未通过URL重写携带会话参数。如果每次请求都没有有效会话标识,Spring会判定每次都是新会话,对应创建新的会话域Bean实例,你看到的3次创建日志对应3次独立的新会话。
  • 非请求线程调用Bean:会话域Bean是和当前Web请求的会话上下文绑定的,如果在无会话上下文的线程(如定时任务线程、异步处理线程)中调用该Bean的方法,Spring会每次调用都生成临时的LdapUser实例,用完即销毁,也会出现多次创建日志,同时属性设置不会持久化。

验证方法

你可以在LdapUser的setshortname方法中添加打印日志,确认方法是否被实际执行:

  • 如果方法日志未打印:说明代理未正确传递方法调用,确认get/set命名规范即可解决。
  • 如果方法日志已打印但后续读取属性为空:说明每次调用的是不同的Bean实例,按上述第二条排查会话绑定问题即可。

内容的提问来源于stack exchange,提问作者Anuska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:45:03