Jsf 托管财产继承
我的问题与此类似。我有一个BaseBean,它当前只有一个被注释为Jsf 托管财产继承,jsf,inheritance,jsf-2,Jsf,Inheritance,Jsf 2,我的问题与此类似。我有一个BaseBean,它当前只有一个被注释为@ManagedProperty的属性 但是,当我在action方法a commandbutton中访问这个继承的托管属性的getter时,它返回null。我调试并确认基本bean构造函数被调用了两次——一次在页面加载时调用,另一次在点击按钮时调用,正如前面提到的链接中所述 我按照文章中提到的建议选择答案和帖子,但没有效果 以下是我的代码: public abstract class BaseBean { @ManagedP
@ManagedProperty
的属性
但是,当我在action方法a commandbutton中访问这个继承的托管属性的getter时,它返回null。我调试并确认基本bean构造函数被调用了两次——一次在页面加载时调用,另一次在点击按钮时调用,正如前面提到的链接中所述
我按照文章中提到的建议选择答案和帖子,但没有效果
以下是我的代码:
public abstract class BaseBean
{
@ManagedProperty(value = "#{serviceLocator}")
private IServiceLocator serviceLocator;
public IServiceLocator getServiceLocator() {
return serviceLocator;
}
public void setServiceLocator(IServiceLocator serviceLocator) {
this.serviceLocator = serviceLocator;
}
}
为什么在表单提交时再次调用构造函数??:/ getter即使在
checkUserExists()
方法中也返回null,该方法通过ajax在userID字段的blur事件上调用
编辑:为ServiceLocator添加了代码
@ManagedBean
@ApplicationScoped
public class ServiceLocator implements IServiceLocator
{
private static final String USER_SERVICE = "userService";
private static final String MOVIE_SERVICE = "movieService";
@PostConstruct
public void init() {
final ServletContext sc = FacesUtils.getServletContext();
this.webAppContext = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
this.userService = (IUserService) webAppContext.getBean(USER_SERVICE);
this.movieService = (IMovieService) webAppContext.getBean(MOVIE_SERVICE);
}
private ApplicationContext webAppContext;
private IUserService userService;
private IMovieService movieService;
@Override
public IUserService getUserService() {
return userService;
}
@Override
public IMovieService getMovieService() {
return movieService;
}
}
ServiceLocator
的代码未显示,因此有许多开放式问题可能有助于确定问题的答案。我会评论或问一个问题,也许有什么东西会让你“啊哈!”:
- 验证
实际上是用ServiceLocator
注释的@ManagedBean
- 记住,您不能注入范围(生命周期)比目标bean短的bean。在这种情况下,如果
是,比如说,ServiceLocator
,那么它就不能被注入到@RequestScoped
bean中@ViewScoped
- 我们是否可以假定,
是由某个托管beanIServiceLocator
实现的接口ServiceLocator
闻起来像EJB;如果是,则使用ServiceLocator
注入EJB@EJB
@RequestScoped
MBean,另一个用于@viewscope
MBean。如果您看到发布的第一个链接,BalusC表示您不必在@ViewScoped
mbeans中设置@ManagedProperty
,如中所示
如果无法通过视图参数传递serviceLocator
,则必须找到另一种方法来获取该值(从会话中保存/检索该值)
此外,请查看BalusC提供的信息,其中解释了为什么每次请求都可以重新创建@ViewScoped
mbean:
简而言之,@ViewScoped在任何UIComponent使用binding属性绑定到bean时,或者在视图中使用JSTL或标记时中断。在这两种情况下,bean的行为都类似于请求范围的bean。在我看来,第一个是一个相当大的bug,第二个只是一个额外的借口,可以在Facelets中去掉所有JSTL内容
这与JSF2.0版本1492有关。以下是一段相关摘录:
这是一个部分州储蓄的鸡/蛋问题。执行视图是为了在应用增量状态之前填充视图,因此我们可以看到您描述的行为。
在这一点上,我没有看到一个明确的方法来解决这个用例。
如果必须使用视图范围的绑定,解决方法是将javax.faces.PARTIAL_STATE_SAVING设置为false
从
根据您的评论和编辑,您可以使用此处提供的代码访问
@ApplicationScoped
mbean:
FacesContext.getCurrentInstance().getExternalContext()
.getApplicationMap().get("serviceLocator");
您必须使用该代码,因为显然,
@ViewScoped
bean不能接受@ManagedProperty
的注入,寄存器的返回字符串会导致视图bean被重新创建…@Daniel:NPE在到达return语句之前发生<代码>getServiceLocator()
返回空值…:|在这里查看我的答案:是,不是,是和否。使用服务定位器类的代码更新了我的问题:)ServiceLocator是一个应用程序范围的bean,它只是将调用委派给服务。我在问题中发布了ServiceLocator代码。谢谢你指出我的困惑:)这似乎是可行的:D。我没有使用这种方法,因为我认为它可以通过注射获得。那么,这对Viewscope有什么影响吗?@VrushankDesai显然是的,看起来除了使用
之外,您不能在@ViewScoped
托管bean中注入bean/值。这很奇怪(甚至对我来说),但我们必须按照atm=\的方式使用这项技术。至少,您成功地解决了问题=)。别忘了把这篇文章标记为答案。
FacesContext.getCurrentInstance().getExternalContext()
.getApplicationMap().get("serviceLocator");