我正在为Gerrit编写一个插件,该插件会临时为一个用户以外的所有用户锁定一个(或多个)分支(例如,以执行两个分支的合并)。
我正在使用Gerrit 2.11.3。
我的问题是,在实现MergeValidationListener
接口的过程中无法获得当前用户。
代码是:
private final Provider<CurrentUser> user;
...
user.get()
例外是:
1) Error in custom provider, com.google.inject.OutOfScopeException: No user on merge thread
at com.google.gerrit.server.util.ThreadLocalRequestContext$1.provideCurrentUser(ThreadLocalRequestContext.java:56) (via modules: com.google.gerrit.server.config.GerritGlobalModule -> com.google.gerrit.server.util.ThreadLocalRequestContext$1)
while locating com.google.gerrit.server.CurrentUser
at com.google.gerrit.server.plugins.PluginGuiceEnvironment$2.configure(PluginGuiceEnvironment.java:534) (via modules: com.google.gerrit.server.plugins.PluginGuiceEnvironment$1 -> com.google.gerrit.server.plugins.PluginGuiceEnvironment$2)
while locating com.google.gerrit.server.CurrentUser
1 error
at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025)
Caused by: com.google.inject.OutOfScopeException: No user on merge thread
我理解的是,实际的提交(或合并)是在没有用户上下文的单独线程中执行的。
是否可以通过某种方式来联系实际用户,即单击“提交”按钮或发出ssh命令? 也许还有其他一些侦听器,它们可以获取用户信息并能够阻止提交?
作为最后一种可能性,我会考虑升级到更高版本。