首页 > 解决方案 > 带参数调用类构造函数

问题描述

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

到目前为止尝试过

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

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

相应的 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);

标签: velocityconfluence

解决方案


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 端完成所有这些操作......


推荐阅读