📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 6.8-7.15

1. 错误异常的基本描述 #

Watcher 的 Jira action 中,project 节点必须是一个对象,用来承载项目键、字段映射等信息。如果解析器在 project 位置没有看到 START_OBJECT,就会抛出当前异常。

典型报错:

failed to parse jira project. expected an object, but found [VALUE_STRING] instead

2. 为什么会发生这个错误 #

附带源码的首个判断已经说明问题本质:

if (token != XContentParser.Token.START_OBJECT) {
    throw new ElasticsearchParseException("failed to parse jira project. expected an object; but found [{}] instead", token);
}

常见原因:

  • project 被写成字符串、数组、布尔值或空值。
  • 程序错误地把项目 key 直接赋给 project,而不是包成对象。
  • 模板渲染时丢失了一层对象结构。

3. 排查方法 #

  1. 定位 Jira action 中的 project 节点。
  2. 确认它是不是 { ... } 对象,而不是单个字符串。
  3. 如果项目配置来自模板,查看最终 JSON 而不是中间数据结构。
  4. 对照一个可运行的 Jira action 示例,核对层级是否一致。

4. 如何解决这个错误 #

project 改成对象结构,例如:

{
  "jira": {
    "account": "ops_jira",
    "issue": {
      "project": {
        "key": "OPS"
      },
      "summary": "cluster alert",
      "description": "watch triggered"
    }
  }
}

不要直接写成:

"project": "OPS"

5. 预防建议 #

  • 为 Jira action 建立固定 schema,强制 project 为 object。
  • 对模板输出做 JSON 结构测试。
  • 复用统一的 Jira action 构造逻辑,减少手工拼接。

相关错误 #

附:日志上下文 #

下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:

XContentParser.Token token = parser.currentToken();
 if (token == null) {
 token = parser.nextToken();
 }
 if (token != XContentParser.Token.START_OBJECT) {
 throw new ElasticsearchParseException("failed to parse jira project. expected an object; but found [{}] instead";
 token);
 }
 String currentFieldName = null;
 while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
 if (token == XContentParser.Token.FIELD_NAME) {