spring - Spring session 范围 Controller 中的 transient 字段

标签 spring session logging spring-3

我有一个 Spring Controller bean 设置为 session 范围,它看起来有点像这样:

@Controller
@Scope(WebApplicationContext.SCOPE_SESSION)
@RequestMapping("/test")
public class SessionTestController implements Serializable {

    private static final long serialVersionUID = -7735095657091576437L;

    private transient Log log;

    @PostConstruct
    public void initialise() {
        log = LogFactory.getLog(getClass());
    }

    @RequestMapping(method=RequestMethod.GET)
    @ResponseBody
    public String doGet() throws InterruptedException {
        log.warn("This line will fail after deserialisation..."); // Causes NPE
    }

}

Spring 似乎在反序列化后没有调用 @PostConstruct,这会导致我的“log”字段变为 null 并在我的 doGet() 方法中抛出 NullPointerException 。

您通常如何处理不可序列化的字段,例如 session 范围 bean 中的记录器?我是否需要实现一些 session 感知接口(interface)才能完成这项工作?

最佳答案

我认为典型的方法是使用 readObject() 来初始化 transient 字段,无论它是否是 Spring bean:

private void readObject(ObjectInputStream stream)
     throws IOException, ClassNotFoundException {
    stream.defaultReadObject();
    initializeTransientFields();
}

关于spring - Spring session 范围 Controller 中的 transient 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12529540/

相关文章:

java - 为什么我的应用程序无法启动(使用 hibernate 搜索配置)?

java - Spring 框架和 RestTemplate : not being able to consume REST Service

php - CodeIgniter session 类并禁用同时从 2 个不同位置登录到同一帐户

powershell - 只能使用交互式输入的凭据建立远程Powershell session 吗?

c# - 在异常构造函数中记录错误是一种好习惯吗?

java - 无法统计应用程序。将 SpringBoot 从 2.0.6.RELEASE 更新到 2.1.0.RELEASE 后

SAFARI 的 PHP session 问题

ios - 如何获取旧的控制台日志

java - Log4j 在本地打印错误堆栈跟踪,但不在服务器上打印

java - 一个组件需要一个名为 'jpaTransactionManager' 的 bean,但找不到