【问题标题】:Call class constructor with parameters带参数调用类构造函数
【发布时间】:2019-06-18 15:46:18
【问题描述】:

在将此 Java 代码 UserNameTermQuery query = new UserNameTermQuery("*"); 转换为 Velocity 时需要帮助。

目前尝试过

#set($query = $content.class.getConstructor('com.atlassian.user.search.query.UserNameTermQuery').newInstance("*"))

没有运气。问题是我需要在自定义宏中运行#set($usernames = $userAccessor.findUsers($query)),而findUsers 不接受字符串,但需要特定类上的对象。而per API 对象必须用一个参数——String 来初始化。

虽然对应的 Java 代码非常简单,但我无法在自定义 Confluence 宏中使用它

import com.atlassian.confluence.user.UserAccessor;
import com.atlassian.user.search.query.UserNameTermQuery;
import com.atlassian.user.search.SearchResult;
import com.atlassian.user.User;

UserNameTermQuery query = new UserNameTermQuery("*");
SearchResult<User> users = userAccessor.findUsers(query);

【问题讨论】:

    标签: velocity confluence


    【解决方案1】:

    getConstructor 方法必须在具有正确参数的正确类上调用。现在,您正在$content 对象的类中搜索构造函数,而不是为getConstructor 提供预期参数的类。

    尝试:

    #set($queryClass = $content.class.forName('com.atlassian.user.search.query.UserNameTermQuery'))
    #set($dummyString = 'foo')
    #set($stringClass = $dummyString.class)
    #set($queryConstructor = $queryClass.getConstructor($stringClass))
    #set($query = $queryConstructor.newInstance('*'))
    

    当然,您最好尝试在 Java 端完成所有这些操作...

    【讨论】:

    • 不幸的是,由于多种原因,我无法使用 Java。但这似乎在 Velocity 中有效,但搜索返回空的用户集。将尝试更多地探索此选项。
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多