取代在@ManagedProperty
註解(在ManagedBean初始化中執行)中通過EL注入Spring bean,獲取在運行時評估EL的bean。
採用這種方法,這是JSF豆應該是什麼樣子:
@ManagedBean
@ViewScoped
public class SomeMB implements Serializable {
private static final long serialVersionUID = 1L;
private static SomeService someService() {
return SpringJSFUtil.getBean("someService");
}
// ...
與公用事業類SpringJSFUtil.java是得到通過EL豆:
import javax.faces.context.FacesContext;
public class SpringJSFUtil {
public static <T> T getBean(String beanName) {
if (beanName == null) {
return null;
}
return getValue("#{" + beanName + "}");
}
@SuppressWarnings("unchecked")
private static <T> T getValue(String expression) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context,
expression, Object.class);
}
}
這消除Spring bean屬性(以進行更多的EL評估爲代價),從而避免了將屬性放在首位的所有序列化問題。
同樣的方法,用OmniFaces:
在我實際的代碼,我使用可用的utility class從OmniFaces的evaluateExpressionGet(String expression)
方法。因此,對於那些你們誰使用過,這是我的代碼真正的樣子:
import static org.omnifaces.util.Faces.evaluateExpressionGet;
@ManagedBean
@ViewScoped
public class SomeMB implements Serializable {
private static final long serialVersionUID = 1L;
private static SomeService someService() {
return evaluateExpressionGet("#{someService}");
}
// ...
請注意,這裏的方法獲取完整的EL(「#{表達式}」),不只是春天bean名稱(或者你會得到一個ClassCastException)。
僅供參考:當您僅使用Java EE自己的EJB而不是Spring時,此問題不存在。 – BalusC
@BalusC是的,我在其他問題上讀到了這個,不幸的是,我對EJB的使用還不夠了解(我不知道我是否可以說服同事讓我在這個項目中嘗試) 。你能指點我一個很好的資源來了解它,順便說一句嗎? – elias
這並不難。只要確保你的容器已經支持EJB(GlassFish,JBoss,Weblogic等)。使用'@ Stateless'或'@ Stateful'註釋服務類並通過'@ EJB'注入它。而已。沒有getter/setter需要順便說一句。 – BalusC