1. 新增YamlLoader.java
package com.intland.codebeamer.config.yaml;
import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class YamlLoader {
public final static YamlConfig config = YamlLoader.load();
public static YamlConfig load() {
// 1. 加载 application.yml
Map<String, Object> mainConfig = load("application.yml");
Map<String, Object> config = new HashMap<>(mainConfig);
// 2. 获取当前激活的环境
String activeProfile = getActiveProfile(mainConfig);
// 3. 加载对应环境的配置
if (activeProfile != null) {
Map<String, Object> profileConfig = load("application-" + activeProfile + ".yml");
config.putAll(profileConfig);
}
return new YamlConfig(config);
}
private static Map<String, Object> load(String filename) {
try (InputStream input = YamlLoader.class.getClassLoader().getResourceAsStream(filename)) {
if (input != null) {
Yaml yaml = new Yaml();
return yaml.load(input);
}
} catch (Exception e) {
throw new RuntimeException("读取配置文件失败:" + filename);
}
return new HashMap<>();
}
private static String getActiveProfile(Map<String, Object> config) {
return getProperty(config, "spring.profiles.active");
}
public static String getProperty(Map<String, Object> config, String keyPath) {
String[] keys = keyPath.split("\\.");
Object current = config;
for (String key : keys) {
if (current instanceof Map) {
current = ((Map<?, ?>) current).get(key);
} else {
return null;
}
}
return (String) current;
}
}
2.新增YamlConfig.java
package com.intland.codebeamer.config.yaml;
import lombok.AllArgsConstructor;
import java.util.Map;
@AllArgsConstructor
public class YamlConfig {
private Map<String, Object> config;
public String getProperty(String property) {
return YamlLoader.getProperty(config, property);
}
}
3.新增 TrackerContentMenuProperties.class
package com.intland.codebeamer.config.menu;
import com.intland.codebeamer.config.yaml.YamlLoader;
public class TrackerContentMenuProperties {
public final static String actives = YamlLoader.config.getProperty("cb.tracker.content-menu.actions");
}
4. 新增 TestMoreActionMenuBuilder.class
package com.intland.codebeamer.ui.view.actionmenubuilder;
import com.intland.codebeamer.persistence.dto.UserDto;
import com.intland.codebeamer.taglib.actionmenu.model.ActionItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Component
public class TestMoreActionMenuBuilder extends TrackerListContextActionMenuBuilder {
@Autowired
private TrackerMoreMenuActionMenuBuilder trackerMoreMenuActionMenuBuilder;
public Map<String, ActionItem> doBuild(HttpServletRequest request, UserDto user, Object subject) throws Exception {
// 保留原按钮
Map<String, ActionItem> actionMap = trackerMoreMenuActionMenuBuilder.doBuild(request, user, subject);
// 新增按钮
actionMap.put("testView", new ActionItem(
"tracker.issues.import.label",
"#",
this.createJavascriptUrl("alert('123');"),
"tracker.issues.import.tooltip"
));
return actionMap;
}
}
5. 新增 application.yml
spring:
profiles:
active: test
6. 新增 application-test.yml
cb:
tracker:
content-menu:
actions: testView
7. 编译java为class放入codebeamer目录
将配置文件与编译后的class文件放入 {CB}/tomcat/webapps/cb/WEB-INF/classes/ 中


8.修改Tracker更多按钮菜单项
编辑 {CB}\bugs\tracker\includes\initTrackerContextMenu.jsp 文件
在 41行 新增代码
<%@ page import="com.intland.codebeamer.config.menu.TrackerContentMenuProperties" %>
<%
pageContext.setAttribute(
"customActions",
TrackerContentMenuProperties.actives
);
%>
修改两处 var 为 actionKeys 的 value,加上 ${customActions},

9.修改菜单项接口ActionMenuBuilder参数
编辑 {CB}\bugs\tracker\browseTrackerAjaxActionMenuHandlers.js 文件
修改变量 MORE_MENU_ACTION_MENU_BUILDER 的值为 testMoreActionMenuBuilder

10. 重启 codebeamer
11.验证效果

浙公网安备 33010602011771号