@ManagedProperty
(ManagedBean の初期化時に実行される) アノテーションで EL を介して Spring Bean を注入する代わりに、実行時に EL を評価する Bean を取得します。
このアプローチでは、JSF Bean は次のようになります。
@ManagedBean
@ViewScoped
public class SomeMB implements Serializable {
private static final long serialVersionUID = 1L;
private static SomeService someService() {
return SpringJSFUtil.getBean("someService");
}
// ...
そして、EL 経由で Bean を取得するユーティリティー・クラスSpringJSFUtil.java :
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を使用した同じアプローチ:
実際のコードでは、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}");
}
// ...
ここで、メソッドは Spring Bean 名だけでなく、完全な EL ("#{expression}") を取得することに注意してください (または ClassCastException を取得します)。