正在载入

等待时间过长时请刷新页面

编写于

最近更新

配置校验

配置服务在加载文件时先检查输入,再提交到活动对象。本文说明检查范围、错误提示以及失败后如何处理;配置对象的定义与绑定见配置文件 ⇱

检查范围

配置服务检查文件根结构、字段类型、泛型集合元素和配置文本引用格式,也会拒绝重复键及循环 YAML 别名。

例如,任意字符串不会被静默转换成 false,整数不能带小数或超出 Java 类型范围,列表与对象不能被强制转换为字符串。布尔值建议统一使用 truefalse;合法的数值字符串仍可转换为对应类型。

这些检查不替代业务规则。“端口必须处于指定范围”“两个字段互斥”等约束,仍由插件自行验证。

控制台与文件注释

校验失败时,文件服务会在控制台告知错误文件:

配置错误:settings.yml

同时在 YAML 文件的错误键前插入诊断注释,其值不会被 Linlang 擅自改变。

database:
  # [Linlang:config] database.port:需要有效的 int 数值,且不能超出类型范围
  port: wrong

注释包含完整键路径及原因。嵌套对象和列表元素会尽量定位到对应节点;文件损坏等原因导致无法定位错误键时,注释会写在文件开头。语法错误给出的原文行号不包含 Linlang 自动插入的诊断注释。

同次校验发现的多个问题会分别记录;重复加载不会重复追加相同诊断。问题修正并成功加载后,服务会清理对应的诊断注释,保留用户注释和配置值。

自行修改诊断注释内容可能使文件服务无法自动删除诊断注释。

JSON 与不可写文件

如果您使用 JSON,诊断内容将写入同目录下的 settings.json.errors.txt。无法修改文件(YAML)时也会尝试使用独立诊断文件。

使用 emit = false@NoEmit,或诊断文件不可写时,文件服务会向控制台打印少量键路径和原因。已有的非 Linlang 诊断文件不会被覆盖。

错误仍通过审计服务的 LIN-FILE-CONFIG-LOAD-FAIL 报告;启用问题文件输出后,其中保留结构化详情。文件语法、字段类型等配置输入错误不会在控制台打印 Java 堆栈。

失败后的状态

首次绑定失败会抛出 ConfigLoadException,不会返回不完整对象。批量 reload() 则继续处理其他文件,最后通过同一异常汇总失败项。失败文件保留原有活动值,成功文件正常更新,不能据此认为全部重载成功。

失败绑定的自动保存会暂停,显式保存也会抛出 ConfigLoadException,防止旧内存值覆盖管理员尚未修正的文件。修正并成功加载后恢复保存。

ConfigLoadException.failures() 提供文件路径与问题列表,每个问题包含 keymessage。错误已经由配置服务报告,调用方应处理失败结果,不要再次打印同一堆栈,也不要继续发送“重载成功”。

处理流程

读取文件 → 版本迁移与默认值合并 → 校验并准备更新
  有错误 → 保留旧值 → 标注文件 → 返回失败
  无错误 → 提交字段与持久化 → 清理诊断 → 返回成功

一个文件加载失败不会回滚其他已成功加载的文件,多个文件之间没有事务保证。配置对象是普通可变 Java 对象,更新字段时也不保证其他线程能一次看到完整的新状态。插件应在同一线程中重载和读取,或自行同步。

讨论

请登录账号