Injecting Guice managed object into JSF View Scoped bean
In previous post, I demonstrate how to integrate JSF with Guice and MyBatis. However, my friend experiences some problem when he is using view scoped backing bean.
He found that he cannot re-inject the service class after serialization. I have done some tricks to solve this problem.This is simply done by overriding the readObject() and writeObject() method.
The BasePageBean in the previous post is changed as follow:
BasePageBean.java
He found that he cannot re-inject the service class after serialization. I have done some tricks to solve this problem.This is simply done by overriding the readObject() and writeObject() method.
The BasePageBean in the previous post is changed as follow:
BasePageBean.java
package org.borislam.view; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import javax.annotation.PostConstruct; import javax.faces.context.FacesContext; import javax.faces.context.Flash; import javax.servlet.ServletContext; import com.google.inject.Inject; import com.google.inject.Injector; import com.ppstation.PpContext; public abstract class BasePageBean implements Serializable{ private transient Injector injector; public BasePageBean() {} public Injector getInjector() { if(injector == null) { ServletContext servletContext = (ServletContext)FacesContext.getCurrentInstance(). getExternalContext().getContext(); injector = (Injector)servletContext.getAttribute(Injector.class.getName()); } return injector; } public void setInjector(Injector injector) { this.injector = injector; } @PostConstruct public void init() { getInjector().injectMembers(this); } private void writeObject(ObjectOutputStream stream) throws IOException { stream.defaultWriteObject(); System.out.println("write object..."); } private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); getInjector().injectMembers(this); System.out.println("read object..."); } public Flash flashScope (){ return (FacesContext.getCurrentInstance().getExternalContext().getFlash()); } }
Comments