Java 通过@ManagedProperty检索更新的值/通知其他bean属性的更新值
我有一个Java 通过@ManagedProperty检索更新的值/通知其他bean属性的更新值,java,jsf-2,Java,Jsf 2,我有一个SessionScopedbean sayUserSession,它拥有一个字符串属性token,它充当登录用户的身份验证令牌。这个令牌被注入到其他会话范围的和视图范围的bean中,以便它们可以使用这个令牌并执行一些操作。我在注入财产方面没有问题 然而,在一个用例中,UserSession本身中的token被另一个字符串替换。一旦我这样做了,其他bean仍然引用令牌的旧值,这会导致无效访问 我如何通知其他bean这个值的变化?或者我是通过 FacesContext context=Fac
SessionScoped
bean sayUserSession
,它拥有一个字符串属性token
,它充当登录用户的身份验证令牌。这个令牌被注入到其他会话范围的
和视图范围的
bean中,以便它们可以使用这个令牌并执行一些操作。我在注入财产方面没有问题
然而,在一个用例中,UserSession
本身中的token
被另一个字符串替换。一旦我这样做了,其他bean仍然引用令牌的旧值,这会导致无效访问
我如何通知其他bean这个值的变化?或者我是通过
FacesContext context=FacesContext.getCurrentInstance();
应用程序app=context.getApplication()
UserSession session=(UserSession)app.evaluateExpressionGet(上下文“#{UserSession}”,UserSession.class)代码>
然后将token
检索为session.getToken()
?
我使用的是Mojarra 2.0.4,我不明白为什么会有问题。这听起来更像是在复制属性,如下所示:
@ManagedBean
@SessionScoped
private OtherBean {
@ManagedProperty(value="#{userSession}")
private UserSession userSession;
private String token;
@PostConstruct
public void init() {
this.token = userSession.getToken();
}
public void someAction() {
doSomethingWith(token);
}
public void otherAction() {
doSomethingElseWith(token);
}
// ...
}
虽然您应该直接访问它:
// ...
public void someAction() {
doSomethingWith(userSession.getToken());
}
public void otherAction() {
doSomethingElseWith(userSession.getToken());
}
// ...
相应地修复您的bean,以摆脱包含副本的私有令牌属性,并让所有方法直接从注入的bean获取副本。抱歉,我不太清楚。我实际上只是指代币属性。比如@ManagedProperty(value=“#{userSession.token}”)私有字符串令牌;因为我不需要整个UserSession对象!然后相应地更改它,使您只有一个{userSession}
托管属性,并使用userSession.getToken()
而不是token
:)字符串是不可变的,因此您基本上是复制令牌而不是引用它。最好是注射整个豆子。基本上只会复制引用(这更便宜!),所有更改都会反射回来。OMG!我完全忽略了不变性的部分!谢谢@BalusC:)