Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过@ManagedProperty检索更新的值/通知其他bean属性的更新值_Java_Jsf 2 - Fatal编程技术网

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 say
UserSession
,它拥有一个字符串属性
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:)