我是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有很多问题。所以我很困惑请告诉我一个应该始终有效的干净方法,不要突然抛出空指针异常。
答案 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对象。