我有一个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
,这会导致我的“log”字段变为null并在我的doGet()
方法中抛出NullPointerException。
您通常如何处理非可序列化字段,例如会话范围内的bean中的记录器?我是否需要实现一些会话感知界面才能使其正常工作?
答案 0 :(得分:2)
我认为一种典型的方法是使用readObject()
来初始化transient
字段,无论它是否是Spring bean:
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initializeTransientFields();
}