如何通过rest_v2向JasperReport Server正确传递JSON数组类型roles参数
JasperReports Server rest_v2 用户接口roles参数组装方案
roles字段为标准JSON数组类型,数组内每个元素是存储角色属性的JSON对象,针对你使用的org.json工具包,可直接参考以下可运行代码补全逻辑:
方式一:逐元素构造JSON结构
适合角色列表动态生成的场景,手动创建JSONArray存放所有角色对象,逐个构造角色属性后放入数组:
import org.json.JSONArray; import org.json.JSONObject; public class JasperUserRequestTest { public static void main(String[] args) { JSONObject jsonBodyInfo = new JSONObject(); try { jsonBodyInfo.put("fullName", "adm"); jsonBodyInfo.put("password", "123"); jsonBodyInfo.put("enabled", true); // 注意补上官方文档要求的enabled字段,旧代码遗漏了该必填项 // 初始化roles数组容器 JSONArray rolesArr = new JSONArray(); // 构造无租户归属的普通用户角色 JSONObject userRole = new JSONObject(); userRole.put("name", "ROLE_USER"); rolesArr.put(userRole); // 构造归属organization_1租户的门店管理员角色 JSONObject storeManagerRole = new JSONObject(); storeManagerRole.put("name", "ROLE_STOREMANAGER"); storeManagerRole.put("tenantId", "organization_1"); rolesArr.put(storeManagerRole); // 将组装完成的数组传入请求体 jsonBodyInfo.put("roles", rolesArr); // 后续执行接口请求逻辑即可 System.out.println(jsonBodyInfo.toString()); } catch (JSONException e) { // 禁止空吞异常,打印堆栈方便排查参数构造错误 e.printStackTrace(); } } }
运行后生成的请求体和官方要求结构完全一致:
{ "enabled": true, "fullName": "adm", "password": "123", "roles": [ {"name": "ROLE_USER"}, {"name": "ROLE_STOREMANAGER", "tenantId": "organization_1"} ] }
方式二:直接解析固定格式的JSON字符串
如果角色配置固定,可直接传入符合格式的JSON字符串构造JSONArray,减少样板代码:
// 省略其余重复代码 JSONArray rolesArr = new JSONArray("[{\"name\":\"ROLE_USER\"},{\"name\":\"ROLE_STOREMANAGER\",\"tenantId\":\"organization_1\"}]"); jsonBodyInfo.put("roles", rolesArr);
常见失效原因排查
- 不要直接传入Java原生集合(比如
ArrayList<HashMap>)、普通Java对象给roles字段,org.json包不会自动将这类对象序列化为符合要求的JSON数组结构 - 角色名称大小写敏感,必须和JasperReports Server中已存在的角色名完全匹配,带租户属性的角色必须填写真实存在的
tenantId,否则接口会自动过滤无效角色配置 - 不要遗漏
enabled必填字段,部分低版本JasperReports Server在缺失该字段时,会直接忽略传入的roles等扩展属性
内容的提问来源于stack exchange,提问作者Erik Martinez Barraza
相关产品推荐
相关产品推荐

