Bozhoが提供するソリューションは機能する可能性がありますが、現在プロキシオブジェクトを使用していないアプリケーションにプロキシオブジェクトを導入したくありません。私の解決策は理想的とは言えませんが、それで仕事は終わります。
トランジェントフィールドをそのままにしました:
transient private ApplicationData _applicationData;
SessionData
また、オブジェクトが最初に作成されたときにJSFが最初に参照を設定できるように、セッターをそのままにしておきました。
public void setApplicationData(ApplicationData applicationData) {
_applicationData = applicationData;
}
私が行った変更は、getterメソッドにありました。オブジェクト内のメソッドはSessionData
、フィールドへの直接アクセスを停止し_applicationData
、代わりにゲッターを介して参照を取得する必要があります。ゲッターは最初にnull参照をチェックします。nullの場合、管理対象Beanは。を介して取得されFacesContext
ます。ここでの制約はFacesContext
、リクエストの存続期間中のみ利用可能であるということです。
/**
* Get a reference to the ApplicationData object
* @return ApplicationData
* @throws IllegalStateException May be thrown if this method is called
* outside of a request and the ApplicationData object needs to be
* obtained via the FacesContext
*/
private ApplicationData getApplicationData() {
if (_applicationData == null) {
_applicationData = JSFUtilities.getManagedBean(
"applicationData", // name of managed bean
ApplicationData.class);
if (_applicationData == null) {
throw new IllegalStateException(
"Cannot get reference to ApplicationData object");
}
}
return _applicationData;
}
誰かが気にかけているなら、これが私のgetManagedBean()
メソッドのコードです:
/**
* <p>Retrieve a JSF managed bean instance by name. If the bean has
* never been accessed before then it will likely be instantiated by
* the JSF framework during the execution of this method.</p>
*
* @param managedBeanKey String containing the name of the managed bean
* @param clazz Class object that corresponds to the managed bean type
* @return T
* @throws IllegalArgumentException Thrown when the supplied key does
* not resolve to any managed bean or when a managed bean is found but
* the object is not of type T
*/
public static <T> T getManagedBean(String managedBeanKey, Class<T> clazz)
throws IllegalArgumentException {
Validate.notNull(managedBeanKey);
Validate.isTrue(!managedBeanKey.isEmpty());
Validate.notNull(clazz);
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null) {
return null;
}
Validate.notNull(facesContext.getApplication());
ELResolver resolver = facesContext.getApplication().getELResolver();
Validate.notNull(resolver);
ELContext elContext = facesContext.getELContext();
Validate.notNull(elContext);
Object managedBean = resolver.getValue(
elContext, null, managedBeanKey);
if (!elContext.isPropertyResolved()) {
throw new IllegalArgumentException(
"No managed bean found for key: " + managedBeanKey);
}
if (managedBean == null) {
return null;
} else {
if (clazz.isInstance(managedBean)) {
return clazz.cast(managedBean);
} else {
throw new IllegalArgumentException(
"Managed bean is not of type [" + clazz.getName() +
"] | Actual type is: [" + managedBean.getClass().getName()+
"]");
}
}
}
そして、私の検証呼び出しを選択しないでください。開発が終わったら取り出します!:)