访问另一个bean

时间:2017-03-26 17:36:44

标签: jsf arguments managed-bean

我是jsf的新手,并使用JSF 2.0将用户信息保存在会话范围的bean中。我需要在其他bean中访问这些信息以进行繁重的工作。目前,这就是我在做的事情: -

private UserBean myuser1 = (UserBean)FacesUtils.getManagedBean("UserBean");
and then access properties as 
if (myuser1.getUserType == 1) ...

这可行,但有些时候抛出Argument Error:参数键是null异常。我也一直在使用以下方法: -

private UserBean myuser2 = new UserBean();
if (myuser2.getUserType == 1) ...

在第二种方法中,我的理解是如果已经在会话中创建了UserBean,则会重试它。关于如何在另一个bean中访问一个bean有很多问题。所以我很困惑请告诉我一个应该始终有效的干净方法,不要突然抛出空指针异常。

4 个答案:

答案 0 :(得分:1)

我所知道的最简单的方法是使用@ManagedProperty,但我不知道你最安全的意思。
假设这是你的sessionScoped bean:

@ManagedBean
@SessionScopped
public class UserBean {
  //bean attributes and methods
}

然后你可以在任何其他bean中访问它(假设它具有相同或更窄的范围)作为这样的属性:

@ManagedBean
@ViewScoped //in this cas you can use SessionScoped, FlowScoped, or RequestScoped too
public class AnotherBean {
  @ManagedProperty("#{userBean}")
  UserBean userB;
  //rest of the bean
  //be sure to add getters and setters for the injected bean
}

有关详细信息,请查看this 希望这会有所帮助。

答案 1 :(得分:0)

您的UserBean应该是有状态的。

@Stateless
@LocalBean
public class MyStatelessBean
{
  @EJB
  private UserBean userBean;

  public String getUserName() { userBean.getName(); };
  public void setUserName( String name_ ) { userBean.setName( name_); }
}

然后将其注入无状态bean以修改其状态:

@ManagedBean
@Dependent
public class MyJSFManagedBean
{
  @EJB
  private UserBean userBean;
}

或者您也可以通过相同的方式从(不是更宽范围的)托管bean访问它:

@Named
@SessionScoped
pubilc class UserBean
{}

您在评论中写道,您根本不使用EJB。图片修改如下:

UserBean应该是SessionScoped CDI bean

@Named
@Request // or @ViewScoped or @Dependent
public class OwnerBean
{
  @Inject
  UserBean userBean;

}

其他CDI bean应该在更近的范围内:

app.use(express.static('dist')) //dist is where your js is bundled

容器自动注意在正确的范围内创建bean并将它们插入到owers中(任何类型的容器管理对象:servlet,过滤器,动作侦听器,JSF / CDI bean)。您需要将更宽范围的资源插入到更薄的范围内。

答案 2 :(得分:0)

实际上,  参数键为空例外:它要么你没有初始化对象女巫可以解决者添加     object = new Object(); //在类的构造函数中。

第二个问题可能是对象是"分离"你需要使用方法merge(使用实体管理器)来调用对象。

分离对象是一个已知值,但JPA系统不知道它是否是来自数据库的最新版本,甚至有时由于某种原因没有设置id值(换句话说它不用jpa管理)可以是你的情况)。

如果em是您的实体经理,并且您具有以下功能:

public Object latestVersion(Object o){em.merge; }

在你的Bean中:

@EJB    服务;

如果你做em.latestVersion(o);解决了分离对象的问题。

真正的答案:

要从其他视图访问对象,您只需执行以下操作即可。

@ManagedBean
@SessionScoped
..... Bean1 {
public static Object o;
.....

}

@ManagedBean
..... Bean 2 {
private Object b=Bean1.o;
.....
}
祝你好运

答案 3 :(得分:0)

在另一个作用域bean中设置作用域bean的依赖关系的标准做法是使用@Inject注释 @Inject UserBean userBean;在你想要的bean中使用UserBean对象。