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

适用版本: 6.8-7.15

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

could not parse [TYPE] action [watchId/actionId]. unexpected string field [field] 表示 Watcher 读取到了一个字符串类型字段,但该字段名不在当前 action 的支持范围内。

从当前源码片段看,这是在 action 逐字段解析字符串值时抛出的异常。也就是说,字段值本身是字符串,但字段名不合法,或者出现在错误层级。

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

常见原因包括:

  • 字段名拼写错误。
  • 把另一个 action 类型的字段复制到了当前 action。
  • 把应该放在 requesttransformcondition 等子对象里的字段,直接放到了 action 根层级。

在当前片段里,解析器只对少数字符串字段做了白名单处理,例如 refresh。如果出现别的字符串字段,就会进入 unexpected string field 分支。

3. 如何排查和解决这个异常和解决这个异常 #

  1. 根据异常中的 [field] 直接定位配置里的同名字段。
  2. 对照当前 action 类型支持的字段列表,确认这个字段是否属于该动作。
  3. 检查它是否应该移动到其他子对象,或是否只是名称拼错。
  4. 如果 watch 来自模板或程序拼装,打印最终 JSON 后再检查层级。

4. 如何解决这个错误 #

常用修复思路 #

  • 删除当前 action 不支持的字符串字段。
  • 修正字段名拼写。
  • 把字段移动到正确的对象中,而不是继续放在 action 根层级。

5. 小结 #

这个异常说明“字段值类型是对的,但字段名或层级错了”。与 unexpected token 不同,它更偏向字段白名单校验失败。

相关错误 #

附:日志上下文 #

"a string value (e.g. 'UTC' or '+01:00').", TYPE, watchId, currentFieldName);
}
} else if (Field.REFRESH.match(currentFieldName, parser.getDeprecationHandler())) {
    refreshPolicy = RefreshPolicy.parse(parser.text());
} else {
    throw new ElasticsearchParseException("could not parse [{}] action [{}/{}]. unexpected string field [{}]", TYPE,
        watchId, actionId, currentFieldName);
}
} else {
    throw new ElasticsearchParseException("could not parse [{}] action [{}/{}]. unexpected token [{}]", TYPE, watchId,
        actionId, token);
}