【问题标题】:How to get a user by email in JIRA Script Runner如何在 JIRA Script Runner 中通过电子邮件获取用户
【发布时间】:2016-08-10 11:12:39
【问题描述】:

在为JIRA Script Runner 编写 Groovy 脚本时,如何通过电子邮件地址获取用户或仅获取用户名?

看来你应该在UserSearchService接口中使用findUsersByEmail方法。

https://docs.atlassian.com/jira/7.0.2/com/atlassian/jira/bc/user/search/UserSearchService.html

但是如何获得这个类的实例呢?

相关问题:How to get a user by email in a JIRA plugin。 不同的是,这个问题是关于插件的,而我的问题是关于 JIRA Script Runner。

此代码不起作用:

setUserProperties(httpMethod: "POST", groups: ["jira-administrators"])
{ MultivaluedMap queryParams, String body, HttpServletRequest request ->

    def userPropertyManager = ComponentAccessor.getUserPropertyManager()
    def userManager = ComponentAccessor.getUserManager()
    def userSearchService = DefaultUserPickerSearchService;
    def users = userSearchService.findUsersByEmail("felicity.smoak@queenconsolidated.com")

    users.each {
        aUser ->
            userPropertyManager.getPropertySet(aUser).setString("jira.meta.Company", "Smoak Technologies")
    }

    return Response.ok(users).build();
}

这是我得到的错误:

2016-04-18 15:23:06,168 ERROR [common.UserCustomScriptEndpoint]: *************************************************************************************
2016-04-18 15:23:06,168 ERROR [common.UserCustomScriptEndpoint]: Script endpoint failed on method: POST setUserProperties
groovy.lang.MissingMethodException: No signature of method: static com.atlassian.jira.bc.user.search.DefaultUserPickerSearchService.findUsersByEmail() is applicable for argument types: (java.lang.String) values: [felicity.smoak@queenconsolidated.com]
Possible solutions: findUsersByEmail(java.lang.String), findUserKeysByEmail(java.lang.String)
    at Script462$_run_closure3.doCall(Script462.groovy:40)
    at com.onresolve.scriptrunner.runner.rest.common.UserCustomScriptEndpoint.doEndpoint(UserCustomScriptEndpoint.groovy:308)
    at com.onresolve.scriptrunner.runner.rest.common.UserCustomScriptEndpoint.postUserEndpoint(UserCustomScriptEndpoint.groovy:208)

编辑

根据@Oldskultxo 和@BjörnKautler 的建议,现在这是我的工作代码:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.user.*
import com.atlassian.jira.bc.user.search.UserSearchService
import com.atlassian.sal.api.user.UserManager
import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import groovy.json.*
import groovy.transform.BaseScript

import javax.servlet.http.HttpServletRequest
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response

@BaseScript CustomEndpointDelegate delegate

setUserProperties(httpMethod: "POST", groups: ["jira-administrators"])
{ MultivaluedMap queryParams, String body, HttpServletRequest request ->

    def userPropertyManager = ComponentAccessor.getUserPropertyManager()
    def userManager = ComponentAccessor.getUserManager()
    def userSearchService = ComponentAccessor.getComponent(UserSearchService.class)
    def users = userSearchService.findUsersByEmail("felicity.smoak@queenconsolidated.com")

    users.each {
        aUser ->
            userPropertyManager.getPropertySet(aUser).setString("jira.meta.Company", "Smoak Technologies")
    }

    return Response.ok("200").build();
}

【问题讨论】:

    标签: groovy jira jira-plugin jira-rest-api


    【解决方案1】:

    如果没有具体的getUserSearchService() 方法,请使用ComponentAccessor.getComponent(UserSearchService) 获得正确的服务。

    【讨论】:

    • 变量UserSearchService未声明,找不到匹配方法com.atlassian.jira.component.ComponentAccessor#getComponent(java.lang.Object)
    • 当然你要么必须导入UserSearchService类,要么使用像com.atlassian.jira.component.ComponentAccessor.getComponent(com.atlassian.jira.bc.user.search.UserSearchService)这样的FQCN
    • 也赞成这个答案,因为def userSearchService = ComponentAccessor.getComponent(UserSearchService.class) 也可以编译并给我想要的结果。
    • 只要在 Groovy 中使用它,就不需要.class.class 仅在您在 Java 代码中使用时才需要。
    【解决方案2】:

    我通常这样获取组件:

    ComponentManager.getComponentInstanceOfType(UserSearchService.class);
    

    然后只是寻找它的方法。

    问候

    【讨论】:

    • 我不确定我是否理解 然后只需寻找它的方法。 - 您是否正在使用具有自动完成功能的 IDE 工作?
    • 没有。我的意思是你可以在 api 中寻找方法。并在显示时使用它们。 docs.atlassian.com/jira/latest/com/atlassian/jira/bc/user/…a这里找方法:findUsersByEmail(String email)。请原谅我的困惑。 :)
    • 你有没有像这样添加导入?导入 com.atlassian.jira.ComponentManager
    • 因为文档是这样说的。引用docs.atlassian.com/jira/latest/com/atlassian/jira/…Plugins developers should use ComponentAccessor for this, instead.
    • @Oldskultxo 不需要写.class。在 Groovy 中,FooFoo.class 相同。如果在 Java 代码中使用它,您只需要 .class。但是由于问题是关于 ScriptRunner 中的 Groovy,所以我的回答非常好。 ;-)
    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2017-01-23
    • 2018-11-28
    • 2017-05-30
    • 2019-09-20
    相关资源
    最近更新 更多