将@Names @ViewScoped注入@SessionScoped

时间:2018-02-25 18:25:47

标签: jsf cdi named-scope

我有两个使用@Named的bean,一个使用@SessionScoped,另一个使用@ViewScoped。我可以将@ViewScoped bean注入@SessionScoped并尝试相反,我几乎可以工作,但我没有相同的实例。

当我在viewScoped Bean的@PostContruct方法中打印this.hashcode()并将其与sessionScoped Bean内部注入的方法进行比较时,我可以看到它。

所以我找到了一个解决方案,但我不知道这是不是一个好习惯:在注入SessionScoped bean之后,在ViewScoped bean的@PostContruct方法中,我通过àsetter将ViewScoped发送到SessionScoped。 / p>

如果我很好理解这些对象与用户联系在一起,那么它没有任何问题,我是对的吗?

@Named
@ViewScoped
public class ViewScopedBean {

    @Inject
    protected SessionScopedBean sessionScopedBean;

    @PostContruct
    public void init(){

        sessionScopedBean.setViewScopedBean(this);
    }
}

@Named
@SessionScoped
public class SessionScopedBean {

    protected ViewScopedBean viewScopedBean ;

    public void setViewScopedBean(ViewScopedBean viewScopedBean){

        this.viewScopedBean = viewScopedBean;
    }
}

1 个答案:

答案 0 :(得分:0)

我看到两个问题:

  1. 这里的主要问题是你有循环依赖。尽量避免这种情况。 ViewScopedBean不能依赖于SessionScopedBean,反之亦然,因为CDI不知道要先创建一个。 (这就是您必须在@PostConstruct方法中手动设置依赖关系的原因。)
  2. 您不能通过比较它们的引用来比较Beans,因为它们被序列化/反序列化,因此不是相同的对象。这就是您应该使用equals()对其进行比较并实施hashCode()方法的原因。