2

我有一个设置为会话范围的 Spring 控制器 bean,它看起来有点像这样:

@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,这导致我的“日志”字段变为 null 并在我的doGet()方法中抛出 NullPointerException。

您通常如何处理会话范围 bean 中的记录器等不可序列化字段?我是否需要实现一些会话感知接口才能使其工作?

4

1 回答 1

2

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

private void readObject(ObjectInputStream stream)
     throws IOException, ClassNotFoundException {
    stream.defaultReadObject();
    initializeTransientFields();
}
于 2012-09-21T12:31:45.507 回答