如何从 freemarker 调用带有枚举参数的方法
How to call methods with enum parameter from freemarker
我想使用 freemarker 模板自定义 Teamcity 通知电子邮件。
从freemarker获取Teamcity数据模型是可行的
数据模型如下所示
<#-- @ftlvariable name="project" type="jetbrains.buildServer.serverSide.SProject" -->
<#-- @ftlvariable name="buildType" type="jetbrains.buildServer.serverSide.SBuildType" -->
<#-- @ftlvariable name="build" type="jetbrains.buildServer.serverSide.SBuild" -->
<#-- @ftlvariable name="agentName" type="java.lang.String" -->
<#-- @ftlvariable name="buildServer" type="jetbrains.buildServer.serverSide.SBuildServer" -->
<#-- @ftlvariable name="webLinks" type="jetbrains.buildServer.serverSide.WebLinks" -->
<#-- @ftlvariable name="var.buildFailedTestsErrors" type="java.lang.String" -->
<#-- @ftlvariable name="var.buildShortStatusDescription" type="java.lang.String" -->
<#-- @ftlvariable name="var.buildChanges" type="java.lang.String" -->
<#-- @ftlvariable name="var.buildCompilationErrors" type="java.lang.String" -->
<#-- @ftlvariable name="link.editNotificationsLink" type="java.lang.String" -->
<#-- @ftlvariable name="link.buildResultsLink" type="java.lang.String" -->
<#-- @ftlvariable name="link.buildChangesLink" type="java.lang.String" -->
<#-- @ftlvariable name="responsibility" type="jetbrains.buildServer.responsibility.ResponsibilityEntry" -->
<#-- @ftlvariable name="oldResponsibility" type="jetbrains.buildServer.responsibility.ResponsibilityEntry" -->
我知道直接通过名字获取bean属性是可以的,比如jetbrains.buildServer.serverSide.SBuildType
中有继承的getName()
方法,所以可以获取名字[=33] =] 来自 freemarker 模板的 buildType.name
。
但是,对于下面的方法,我不知道如何从模板中获取具有不同参数的 buildArtifacts。
方法文档如下:
getArtifacts
@NotNull
BuildArtifacts getArtifacts(@NotNull
BuildArtifactsViewMode mode)
Returns accessor for build artifacts. This accessor checks all necessary permissions for accessing files.
Parameters:
mode - view mode to see artifacts
Returns:
build artifacts viewer
BuildArtifactsViewMode
的定义如下,
Enum BuildArtifactsViewMode
VIEW_ALL
Will show all build artifacts i.e.
VIEW_ALL_WITH_ARCHIVES_CONTENT
Will show all build artifacts and archives content
VIEW_DEFAULT
Will show all user-published artifacts
VIEW_DEFAULT_WITH_ARCHIVES_CONTENT
Will show all user-published artifacts and archives content
VIEW_HIDDEN_ONLY
Will show only hidden build artifacts
提前感谢您的帮助。
我对 Teamcity 一无所知,但作为模板作者,您依赖于向您公开的内容,并且 类 和枚举不会在最小的 FreeMarker 设置中公开。如果您有权在 Teamcity 中配置 FreeMarker,或者添加填充数据模型的 Java 代码,那么您可以这样做(这里我使用基于 Configuration
的方法,但是您也可以类似地将它们添加到数据模型中):
cfg.setSharedVariable(
"enums",
((BeansWrapper) cfg.getObjectWrapper()).getEnumModels());
然后在模板中:
${someMethod(enums['com.example.MyEnum'].FOO)}
and/or 你可以这样做:
cfg.setSharedVariable(
"MyEnum",
((BeansWrapper) cfg.getObjectWrapper()).getEnumModels().get(MyEnum.class.getName()));
然后在模板中:
${someMethod(MyEnum.FOO)}
如果 Teamcity 不允许您做这样的事情,那么他们就有责任确保为您提供一些类似的设施,我们希望其他人知道这一点...
我想使用 freemarker 模板自定义 Teamcity 通知电子邮件。
从freemarker获取Teamcity数据模型是可行的
数据模型如下所示
<#-- @ftlvariable name="project" type="jetbrains.buildServer.serverSide.SProject" -->
<#-- @ftlvariable name="buildType" type="jetbrains.buildServer.serverSide.SBuildType" -->
<#-- @ftlvariable name="build" type="jetbrains.buildServer.serverSide.SBuild" -->
<#-- @ftlvariable name="agentName" type="java.lang.String" -->
<#-- @ftlvariable name="buildServer" type="jetbrains.buildServer.serverSide.SBuildServer" -->
<#-- @ftlvariable name="webLinks" type="jetbrains.buildServer.serverSide.WebLinks" -->
<#-- @ftlvariable name="var.buildFailedTestsErrors" type="java.lang.String" -->
<#-- @ftlvariable name="var.buildShortStatusDescription" type="java.lang.String" -->
<#-- @ftlvariable name="var.buildChanges" type="java.lang.String" -->
<#-- @ftlvariable name="var.buildCompilationErrors" type="java.lang.String" -->
<#-- @ftlvariable name="link.editNotificationsLink" type="java.lang.String" -->
<#-- @ftlvariable name="link.buildResultsLink" type="java.lang.String" -->
<#-- @ftlvariable name="link.buildChangesLink" type="java.lang.String" -->
<#-- @ftlvariable name="responsibility" type="jetbrains.buildServer.responsibility.ResponsibilityEntry" -->
<#-- @ftlvariable name="oldResponsibility" type="jetbrains.buildServer.responsibility.ResponsibilityEntry" -->
我知道直接通过名字获取bean属性是可以的,比如jetbrains.buildServer.serverSide.SBuildType
中有继承的getName()
方法,所以可以获取名字[=33] =] 来自 freemarker 模板的 buildType.name
。
但是,对于下面的方法,我不知道如何从模板中获取具有不同参数的 buildArtifacts。
方法文档如下:
getArtifacts
@NotNull
BuildArtifacts getArtifacts(@NotNull
BuildArtifactsViewMode mode)
Returns accessor for build artifacts. This accessor checks all necessary permissions for accessing files.
Parameters:
mode - view mode to see artifacts
Returns:
build artifacts viewer
BuildArtifactsViewMode
的定义如下,
Enum BuildArtifactsViewMode
VIEW_ALL
Will show all build artifacts i.e.
VIEW_ALL_WITH_ARCHIVES_CONTENT
Will show all build artifacts and archives content
VIEW_DEFAULT
Will show all user-published artifacts
VIEW_DEFAULT_WITH_ARCHIVES_CONTENT
Will show all user-published artifacts and archives content
VIEW_HIDDEN_ONLY
Will show only hidden build artifacts
提前感谢您的帮助。
我对 Teamcity 一无所知,但作为模板作者,您依赖于向您公开的内容,并且 类 和枚举不会在最小的 FreeMarker 设置中公开。如果您有权在 Teamcity 中配置 FreeMarker,或者添加填充数据模型的 Java 代码,那么您可以这样做(这里我使用基于 Configuration
的方法,但是您也可以类似地将它们添加到数据模型中):
cfg.setSharedVariable(
"enums",
((BeansWrapper) cfg.getObjectWrapper()).getEnumModels());
然后在模板中:
${someMethod(enums['com.example.MyEnum'].FOO)}
and/or 你可以这样做:
cfg.setSharedVariable(
"MyEnum",
((BeansWrapper) cfg.getObjectWrapper()).getEnumModels().get(MyEnum.class.getName()));
然后在模板中:
${someMethod(MyEnum.FOO)}
如果 Teamcity 不允许您做这样的事情,那么他们就有责任确保为您提供一些类似的设施,我们希望其他人知道这一点...