核心功能(已连接真实源服务器验证):
- /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>
23 lines
2.6 KiB
Markdown
23 lines
2.6 KiB
Markdown
---
|
||
name: solon-pitfalls
|
||
description: Solon框架的正确API用法(redisx/定时任务/HTTP/注解/配置文件/打包),踩坑后实测确认
|
||
metadata:
|
||
type: reference
|
||
---
|
||
|
||
联调实测确认的 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()`。
|
||
|
||
关联 [[architecture-local-passthrough]]、[[jeecg-token-mechanism]]。
|