核心功能(已连接真实源服务器验证):
- /sys/watchUserLogin 本地处理:RSA解密验证设备密码(防伪造) + 单飞换token + Redis缓存
- 业务接口经本地通配Controller手动HttpUtils透传至源服务器 + 401检测清缓存
- token失效三重自愈:10秒探活 + 预过期刷新 + 被动401兜底
配置隔离(dotenv风格)+ 安全:
- .env 存敏感信息不入库;app.yml 用 ${KEY} 占位符引用;EnvLoader启动前加载
- 移除fastjson(规避0day),JSON改用Solon内置snack4
联调修复多个Solon实际API问题(配置文件名/YAML插件/打包/redisx/注解路径等)
Co-Authored-By: Claude <noreply@anthropic.com>
2.6 KiB
2.6 KiB
name, description, metadata
| name | description | metadata | ||
|---|---|---|---|---|
| solon-pitfalls | Solon框架的正确API用法(redisx/定时任务/HTTP/注解/配置文件/打包),踩坑后实测确认 |
|
联调实测确认的 Solon 4.0.4 正确用法(多次踩坑后验证,务必牢记):
- 配置文件名:Solon 默认读
app.yml,不是application.yml。配置文件名错会导致所有配置读不到(null)。 - YAML 插件:默认只读 .properties,需加
org.noear:solon-config-yaml依赖才能读 .yml,否则报profile is not supported。 - 打包插件:用
org.noear:solon-maven-plugin(repackage 目标),不要用 maven-assembly-plugin(版本号易错,且非 Solon 标配)。插件版本用 3.10.5(与 solon 主框架 4.0.4 不同版本线)。 - 日志:需加
slf4j-simple实现,否则 SLF4J 退化为 NOP 无日志。 - Redis(redisx):是独立库,无自动注入。手动
new RedisClient(Properties),Properties key 为server/db/password/user/maxTotal。不要用@Inject("${redis}") RedisClient。API:getBucket().store/get、open(session -> session.key(k).delete())。 - 定时任务注解:
@Scheduled/@EnableScheduling在org.noear.solon.scheduling.annotation(来自solon-scheduling依赖,非solon-scheduling-simple)。 - Context:路径
org.noear.solon.core.handle.Context(非org.noear.solon.core.Context)。方法:path()、queryString()、method()、body()、headerNames()、header(name)、status(int)、headerSet(k,v)、output(String)。 - HTTP 客户端:
solon-net-httputils。HttpUtils.http(url).exec(method)返回 HttpResponse。状态码resp.code()(非 status)。body 用bodyOfJson(String)(无body(String)单参重载,只有body(byte[])/body(content,contentType))。响应体resp.bodyAsString()。 - 占位符:
${KEY}能解析System.setProperty注入的值(联调验证)。 - JSON 返回:Controller 返回 HashMap 会被 snack4 序列化为
{key=value}非标准 JSON。返回标准 JSON 用 snack4 ONode(new ONode().asObject()+.set(k,v))+@Produces("application/json")。不使用 fastjson(规避 0day 漏洞),JSON 处理统一用 Solon 内置 snack4(org.noear.snack4.ONode)。 - snack4 API:解析
ONode.ofJson(str);取值node.getOrNull(key).getString()/.getLong();构造对象new ONode().asObject().set(k,v);序列化ONode.serialize(obj)或node.toJson()。