Java 如何在“问题”选项卡面板中渲染velocity模板?

Java 如何在“问题”选项卡面板中渲染velocity模板?,java,velocity,jira-plugin,atlassian-plugin-sdk,Java,Velocity,Jira Plugin,Atlassian Plugin Sdk,我按照这个非常简单的教程添加了一个新的问题选项卡面板。它显示了如何使用stringBuilder向页面添加简单内容。理想情况下,我希望使用velocity模板,因为它更易于使用,并且可以适当地分离逻辑。我有一个模板文件,其中包含: <div class="mod-header"> <h3>$i18n.getText('service-now-tab-panel.label')</h3> </div> 在“问题”选项卡面板上渲染veloci

我按照这个非常简单的教程添加了一个新的问题选项卡面板。它显示了如何使用stringBuilder向页面添加简单内容。理想情况下,我希望使用velocity模板,因为它更易于使用,并且可以适当地分离逻辑。我有一个模板文件,其中包含:

<div class="mod-header">
    <h3>$i18n.getText('service-now-tab-panel.label')</h3>
</div>
在“问题”选项卡面板上渲染velocity模板的文档非常稀少,几乎不存在。如果有人能帮我指出正确的方向那就太好了。 这里还有属性文件

<issue-tabpanel key="service-now-tab-panel" name="Service Now Tab Panel" i18n-name-key="service-now-tab-panel.name" class="com.verys.jira.plugins.panels.ServiceNowTabPanel">
  <description key="service-now-tab-panel.description">The Service Now Tab Panel Plugin</description>
  <label key="service-now-tab-panel.label">Plugin Test</label>
  <order>10</order>
  <resource type="velocity" name="view" location="templates/tabpanels/service-now-tab-panel.vm"/>
  <supports-ajax-load>true</supports-ajax-load>
</issue-tabpanel>

“立即服务”选项卡面板插件
插件测试
10
真的

为了渲染velocity模板,需要导入5个类

import com.atlassian.jira.config.properties.APKeys;
import com.atlassian.jira.config.properties.ApplicationProperties;
import com.atlassian.jira.util.VelocityParamFactory;
import com.atlassian.velocity.VelocityManager;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.config.properties.APKeys;
在函数内部,您需要初始化ComponentAccessor并获取应用程序属性

ApplicationProperties ap = ComponentAccessor.getApplicationProperties();
拥有应用程序属性“ap”后,就可以获得Velocity manager所依赖的应用程序密钥

String baseUrl = ap.getString(APKeys.JIRA_BASEURL);
String webworkEncoding = ap.getString(APKeys.JIRA_WEBWORK_ENCODING);
一旦你有了
baseUrl
webworkEncoding
,你就可以开始初始化
VelocityManager
VelocityParamFactory
这两个类允许你创建一个管理器,它允许你对模板进行编码,或者获取模板的主体,以及获取默认值每个速度模板的参数

VelocityManager vm = ComponentAccessor.getVelocityManager();
VelocityParamFactory vp = ComponentAccessor.getVelocityParamFactory();
初始化后,您应该创建一个上下文值的
映射
,该值分配给
VelocityParamFactory
,允许您获取和设置每个模板的参数。您可以传入值,以便稍后在velocity模板中使用

Map context = vp.getDefaultVelocityParams(); 
context.put("testVariable", ["Value can be a string or an array or a collection"]);
通过使用之前设置的map
context
,您可以开始使用
put
方法为上下文变量赋值,稍后将在velocity模板中使用

Map context = vp.getDefaultVelocityParams(); 
context.put("testVariable", ["Value can be a string or an array or a collection"]);
假设您想要渲染出velocity模板,则可以使用
getBody
方法或
getEncodedBody
方法。两者基本上做相同的事情,但工作方式非常不同。我建议大家仔细阅读如何使用每一个用例,以及哪一个用例是正确的

String renderedText = vm.getEncodedBody("templates/", "service-now-tab-panel.vm", baseUrl, webworkEncoding, context);
您需要设置
模板路径
模板文件
基本URL
webWorkEncoding
,最后设置
上下文
,该上下文包含您在上下文中输入的任何参数,这些参数将在velocity模板中作为字符串返回给变量
renderedText

根据您在Jira中所做的方式和内容,有两种不同的方式将其传递给您的视图。我会让你们自己去弄清楚,但我创建了一个IssueTabPanel,就是这样呈现出来的:

return Collections.singletonList(new GenericMessageAction( renderedText ));
所以总的来说,ti应该是这样的:

ApplicationProperties ap = ComponentAccessor.getApplicationProperties();
String baseUrl = ap.getString(APKeys.JIRA_BASEURL);
String webworkEncoding = ap.getString(APKeys.JIRA_WEBWORK_ENCODING);

VelocityManager vm = ComponentAccessor.getVelocityManager();
VelocityParamFactory vp = ComponentAccessor.getVelocityParamFactory();

Map context = vp.getDefaultVelocityParams();
context.put("test", "test");

String renderedText = vm.getEncodedBody("templates/", "service-now-tab-panel.vm", baseUrl, webworkEncoding, context);

return Collections.singletonList(new GenericMessageAction(renderedText));

这是我从研究中了解到的情况。这可能不是最好的方法,也可能不是绝对正确的方法,但这种方法会奏效!如果有人需要添加任何内容以使其更清晰、彻底,请编辑它或将其转换为wiki。

Dyllen,您在没有atlassian的任何文档的情况下完成了出色的工作!以下是我根据JIRA资料汇编的关于这个主题的简短教程:@VolodymyrKrupach嘿,谢谢你,我真的很感谢你的回答。想到亚特兰西的文献在这个问题上如此稀少,真是太疯狂了。这是我的第一个JIRA插件,所以我肯定会犯错误,知道有其他人在开发简单的解决方案时遇到同样的问题,这真是太棒了。我更喜欢你实现你的代码的方式,所以我继续改变了我的代码:)!谢谢!!>你实现了你的,我只是查看了JIRA的源代码并从那里复制,这就是我们在没有文档时必须做的:-)。