尽管Bozho提供的解决方案可行,但我不想将代理对象引入当前未使用它们的应用程序中。我的解决方案不理想,但是可以完成工作。
我将瞬变场留在原处:
transient private ApplicationData _applicationData;
我还保留了setter,以便JSF可以
SessionData在首次创建对象时初始设置引用:
public void setApplicationData(ApplicationData applicationData) { _applicationData = applicationData;}我所做的更改是使用getter方法进行的。
SessionData现在,该对象中的方法需要停止直接访问该
_applicationData字段,而是通过getter获取引用。吸气剂将首先检查空引用。如果为null,则通过来获取托管bean
FacesContext。这里的约束是,
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()方法的代码:
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()+ "]"); } }}而且不要接听我的验证电话。开发完成后,我将其淘汰!:)



