我有一个 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/