Jsf 托管财产继承

Jsf 托管财产继承,jsf,inheritance,jsf-2,Jsf,Inheritance,Jsf 2,我的问题与此类似。我有一个BaseBean,它当前只有一个被注释为@ManagedProperty的属性 但是,当我在action方法a commandbutton中访问这个继承的托管属性的getter时,它返回null。我调试并确认基本bean构造函数被调用了两次——一次在页面加载时调用,另一次在点击按钮时调用,正如前面提到的链接中所述 我按照文章中提到的建议选择答案和帖子,但没有效果 以下是我的代码: public abstract class BaseBean { @ManagedP

我的问题与此类似。我有一个BaseBean,它当前只有一个被注释为
@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
    ,那么它就不能被注入到
    @ViewScoped
    bean中

  • 我们是否可以假定,
    IServiceLocator
    是由某个托管bean
    ServiceLocator
    实现的接口

  • ServiceLocator
    闻起来像EJB;如果是,则使用
    @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");