Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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 Guice-如何在不同的范围内以不同的方式提供相同的密钥?_Java_Guice_Guice Servlet - Fatal编程技术网

Java Guice-如何在不同的范围内以不同的方式提供相同的密钥?

Java Guice-如何在不同的范围内以不同的方式提供相同的密钥?,java,guice,guice-servlet,Java,Guice,Guice Servlet,Guice用户!我在这里遇到了一个情况,我可以找到一个解决办法,但我对我的解决方案不满意。这很像,但答案不适合我的情况 我有一个这样的类,我在很多地方注入: MyBusinessClass { @Inject MyBusinessClass(@AuthenticatedUser User user) {}; } 在过去的某个时刻,我刚刚从web会话中获得了@AuthenticatedUser,因此我有: bind(User.class).annotatedWith(Authen

Guice用户!我在这里遇到了一个情况,我可以找到一个解决办法,但我对我的解决方案不满意。这很像,但答案不适合我的情况

我有一个这样的类,我在很多地方注入:

MyBusinessClass {
    @Inject
    MyBusinessClass(@AuthenticatedUser User user) {};
}
在过去的某个时刻,我刚刚从web会话中获得了
@AuthenticatedUser
,因此我有:

bind(User.class).annotatedWith(AuthenticatedUser.class).toProvider(new AuthenticatedUserProvider());
...
public static class AuthenticatedUserProvider implements Provider<User> {
    @Inject
    Provider<Session> session;
    public User get() {
        return SessionUtil.getUserFromSession(session.get());
    }
}
提供程序使用try-a-error方法查找可用的会话(web会话或作业会话),并返回用户它能够获得的第一个会话。它之所以有效,是因为
@com.google.inject.inject(optional=true)
,还因为作用域是互斥的


有没有更好的方法来实现这一点?我只想让
MyBusinessClass
注入
@AuthenticatedUser
以透明地使用它的任何作用域,并让Guice模块/提供者找到合适的位置来获得满意的实例。

我不认为有必要使用
optional=true
是否尝试
ServletScopes.scopeRequest()
optional=true
是必需的,因为在对象超出范围时插入提供程序会导致错误。我不知道
ServletScopes.scopeRequest()
,但不幸的是,它在这里没有帮助,因为我的作业范围比调用
可调用的
要复杂得多:(注入
提供者
应该可以工作,即使对象超出范围。只有在调用
.get()时)
您将从ScopeException中获得
的异常。Tavian,这是我的问题。由于我无法检查当前所在的作用域,因此我无法选择应该调用哪个提供程序
get()
。唯一的方法是调用每个提供程序,直到没有错误为止。
public static class AuthenticatedUserProvider implements Provider<User> {
    @com.google.inject.Inject(optional=true)
    Provider<Session> session;
    @com.google.inject.Inject(optional=true)
    Provider<JobSession> jobSession;
    @Override
    public User get() {
        try {
            return SessionUtil.getUserFromSession(session.get());
        } catch (Exception e) {
            try {
                return SessionUtil.getUserFromJobSession(jobSession.get());
            } catch (Exception ee) {
                throw new IllegalStateException("Current scope doesn't have a auth user!");
            }
        }
    }
}