Expert guide for the tinystruct Java framework covering Application classes, @Action routing, unit testing, HTTP/CLI dual-mode, JSON serialization with Builder, database persistence via AbstractData, SSE, file uploads, and outbound HTTP.
How this skill is triggered — by the user, by Claude, or both
Slash command
/everything-claude-code:tinystruct-patternsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
使用 **tinystruct** Java 框架构建模块的架构和实现模式 — 一个轻量级、高性能的框架,将 CLI 和 HTTP 视为同等公民,不需要 `main()` 方法和最少的配置。
使用 tinystruct Java 框架构建模块的架构和实现模式 — 一个轻量级、高性能的框架,将 CLI 和 HTTP 视为同等公民,不需要 main() 方法和最少的配置。
CLI 和 HTTP 是同等公民。 每个用 @Action 标注的方法理想情况下应该可以在终端和 Web 浏览器中不加修改地运行。这种"双模式"能力是 tinystruct 的核心设计理念。
AbstractApplication 创建新的 Application 模块。@Action 定义路由和命令行操作。Context 处理每次请求的状态。Builder 和 Builders 组件执行 JSON 序列化。AbstractData POJO 处理数据库持久化。generate 命令从数据库表生成 POJO。URLRequest 和 HTTPHandler 发出出站 HTTP 请求。application.properties 中配置数据库连接或系统设置。tinystruct 框架将任何用 @Action 标注的方法视为终端和 Web 环境的可路由端点。应用程序通过扩展 AbstractApplication 创建,它提供核心生命周期钩子如 init() 和对请求 Context 的访问。
路由由 ActionRegistry 处理,它自动将路径段映射到方法参数并注入依赖。对于仅数据服务,应使用原生 Builder 和 Builders 组件进行 JSON 序列化以保持零依赖。数据库层使用 AbstractData POJO 配合 XML 映射文件进行 CRUD 操作,无需外部 ORM 库。
public class MyService extends AbstractApplication {
@Override
public void init() {
this.setTemplateRequired(false); // 对数据/API 应用禁用 .view 查找
}
@Override public String version() { return "1.0.0"; }
@Action("greet")
public String greet() {
return "Hello from tinystruct!";
}
// 路径参数:GET /?q=greet/James 或 bin/dispatcher greet/James
@Action("greet")
public String greet(String name) {
return "Hello, " + name + "!";
}
}
@Action(value = "login", mode = Mode.HTTP_POST)
public String doLogin(Request<?, ?> request) throws ApplicationException {
request.getSession().setAttribute("userId", "42");
return "Logged in";
}
import org.tinystruct.data.component.Builder;
import org.tinystruct.data.component.Builders;
@Action("api/data")
public String getData() throws ApplicationException {
Builders dataList = new Builders();
Builder item = new Builder();
item.put("id", 1);
item.put("name", "James");
dataList.add(item);
Builder response = new Builder();
response.put("status", "success");
response.put("data", dataList);
return response.toString(); // {"status":"success","data":[{"id":1,"name":"James"}]}
}
import org.tinystruct.http.SSEPushManager;
@Action("sse/connect")
public String connect() {
return "{\"type\":\"connect\",\"message\":\"Connected to SSE\"}";
}
// 推送给特定客户端
String sessionId = getContext().getId();
Builder msg = new Builder();
msg.put("text", "Hello, user!");
SSEPushManager.getInstance().push(sessionId, msg);
// 广播给所有人
SSEPushManager.getInstance().broadcast(msg);
import org.tinystruct.data.FileEntity;
@Action(value = "upload", mode = Mode.HTTP_POST)
public String upload(Request<?, ?> request) throws ApplicationException {
List<FileEntity> files = request.getAttachments();
if (files != null) {
for (FileEntity file : files) {
System.out.println("已上传: " + file.getFilename());
}
}
return "Upload OK";
}
设置在 src/main/resources/application.properties 中管理。
# 数据库
driver=org.h2.Driver
database.url=jdbc:h2:~/mydb
database.user=sa
database.password=
# 服务器
default.home.page=hello
server.port=8080
# 区域设置
default.language=en_US
# 会话(集群环境使用 Redis)
# default.session.repository=org.tinystruct.http.RedisSessionRepository
# redis.host=127.0.0.1
# redis.port=6379
在应用程序中访问配置值:
String port = this.getConfiguration("server.port");
| 症状 | 正确模式 |
|---|---|
导入 com.google.gson 或 com.fasterxml.jackson | 使用 org.tinystruct.data.component.Builder / Builders。 |
使用 List<Builder> 处理 JSON 数组 | 使用 Builders 避免泛型类型擦除问题。 |
ApplicationRuntimeException: template not found | 在 init() 中为纯 API 应用调用 setTemplateRequired(false)。 |
用 @Action 标注 private 方法 | Actions 必须是 public 才能被框架注册。 |
在应用中硬编码 main(String[] args) | 使用 bin/dispatcher 作为所有模块的入口点。 |
手动 ActionRegistry 注册 | 优先使用 @Action 注解进行自动发现。 |
| 运行时找不到 Action | 确保类通过 --import 导入或在 application.properties 中列出。 |
| CLI 参数不可见 | 使用 --key value 传递;通过 getContext().getAttribute("--key") 访问。 |
| 两个方法同路径,触发了错误的那个 | 设置显式 mode(如 HTTP_GET vs HTTP_POST)来消歧。 |
init() 中设置:利用 init() 进行设置(配置、数据库)而非构造器。不要调用 setAction() — 使用 @Action 注解。@Action 中使用 Mode 参数将敏感操作限制为仅 CLI 或特定的 HTTP 方法。getContext().getAttribute("--flag") 而非添加参数到方法签名。CompletableFuture.runAsync()。详细指南可在 references/ 目录中找到:
src/main/java/org/tinystruct/AbstractApplication.java — 带生命周期钩子的核心基类src/main/java/org/tinystruct/system/annotation/Action.java — 注解与模式src/main/java/org/tinystruct/application/ActionRegistry.java — 路由引擎src/main/java/org/tinystruct/data/component/Builder.java — JSON 对象序列化器src/main/java/org/tinystruct/data/component/Builders.java — JSON 数组序列化器src/main/java/org/tinystruct/data/component/AbstractData.java — 带 CRUD 的基础 POJO 类src/main/java/org/tinystruct/data/Mapping.java — 映射 XML 解析器src/main/java/org/tinystruct/data/tools/MySQLGenerator.java — POJO 生成器参考src/main/java/org/tinystruct/data/component/FieldType.java — SQL 到 Java 类型映射src/main/java/org/tinystruct/data/component/Condition.java — 流式 SQL 查询构建器src/main/java/org/tinystruct/http/SSEPushManager.java — SSE 连接管理src/test/java/org/tinystruct/application/ActionRegistryTest.java — Registry 测试示例src/test/java/org/tinystruct/system/HttpServerHttpModeTest.java — HTTP 集成测试模式npx claudepluginhub aaione/everything-claude-code-zhExpert guidance for developing with the tinystruct Java framework — creating Application classes, @Action routes, HTTP/CLI dual-mode handling, JSON serialization, and database persistence.
Provides Spring Boot patterns for REST API design, layered architecture (Controller-Service-Repository), Spring Data JPA repositories, transactional services, DTO validation, and global exception handling. Useful for scalable Java backends.
Provides Spring Boot patterns and best practices for architecture (services, controllers, DI), database (JPA, Flyway, transactions), security (JWT, OAuth2), validation, error handling, testing (JUnit, Mockito), and caching.