jmicro

An open-source framework based on Spring Boot, helps you create applications more easily

View project on GitHub

J Micro Common

doc dokka

通用工具模块,提供 JSON 处理、日期格式化、表单校验规则生成、基础校验注解以及常用工具类,支持 Java 与 Kotlin 项目。

目录

引入依赖

<dependency>
    <groupId>com.jiangtj.micro</groupId>
    <artifactId>micro-common</artifactId>
</dependency>

建议配合 micro-dependencies BOM 使用,省略版本号(见根 README)。

功能概览

  • JSON 工具:JsonUtils 统一的 JsonMapper 封装、扩展函数 toJson/fromJson。
  • 日期格式化:常用 DateTimeFormatter 常量(DATE_TIME、RFC3339 等)。
  • 表单规则生成:FormRuleGenerator 根据 jakarta.validation 注解生成 async-validator 规则。
  • JSON Schema 生成:JsonSchemaGenerator 根据数据类生成 JSON Schema(draft 2020-12)。
  • 校验注解:@MobilePhone、@MinLength、@MaxLength。
  • 异常基类:MicroException、MicroHttpException、MicroProblemDetailException。
  • 常用工具类:FileNameUtils、UUIDUtils、RandomStringUtils、PhoneNumberUtils、MapUtils。

使用示例

JSON 处理

val payload = mapOf("name" to "micro")
val json = JsonUtils.toJson(payload)
val back = JsonUtils.fromJson(json, Map::class.java)

val json2 = payload.toJson()
val back2: Map<String, String> = json2.fromJson()

如果需要替换默认的 JsonMapper(应用启动时由 JMicroCommonAutoConfiguration 初始化):

val mapper = JsonMapper.builder().build()
JsonUtils.init(mapper)

日期格式化

val now = LocalDateTime.now()
val text = now.format(DATE_TIME)
val rfc3339 = now.atOffset(ZoneOffset.UTC).format(RFC3339)

表单规则生成

FormRuleGenerator 会读取 jakarta.validation 及 micro-common 自定义注解,生成前端表单校验规则。

@Data
class Example {
    @NotBlank
    private String name;

    @Min(18)
    private int age;

    @MobilePhone
    private String phone;
}

Map<String, List<FormRule>> rules = FormRuleGenerator.generate(Example.class);
String json = JsonUtils.toJson(rules);

Kotlin 也可以直接使用泛型版本:

val rules = FormRuleGenerator.generate<Example>()

如果需要自定义规则处理器:

FormRuleGenerator.addHandler(CustomHandler())

JSON Schema 生成

JsonSchemaGenerator 会根据字段类型、Jackson 注解与 jakarta.validation 注解,把数据类转换为 JSON Schema(draft 2020-12):

data class BookForm(
    @field:NotBlank @field:Size(max = 128) val title: String,
    @field:Size(max = 32) val isbn: String? = null,
    @field:NotNull @field:DecimalMin("0") val price: BigDecimal,
)

val schema = JsonSchemaGenerator.generate<BookForm>()
val json = JsonUtils.toJson(schema)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "BookForm",
  "type": "object",
  "properties": {
    "title": {"type": "string", "minLength": 1, "maxLength": 128},
    "isbn": {"type": "string", "maxLength": 32},
    "price": {"type": "number", "minimum": 0}
  },
  "required": ["title", "price"]
}

Java 中可直接传入 Class:

JsonSchema schema = JsonSchemaGenerator.generate(BookForm.class);

说明:

  • Kotlin 非空属性以及 @NotNull / @NotBlank / @NotEmpty 会进入 required。
  • 支持嵌套对象、集合/数组(items)、Map(additionalProperties)、枚举(enum)。
  • 日期时间类型会映射为 format:date、time、date-time;UUID、URI 也会带上 format。
  • 结果按类缓存,重复调用不会重复解析;存在循环引用时会截断为 {"type": "object"}。

校验注解

  • @MobilePhone:支持 String 与 Long 类型的手机号校验。
  • @MinLength / @MaxLength:补充字符串长度校验(可配置是否 trim)。

常用工具类

val filename = FileNameUtils.getRandomFileNameWithSuffix("png")
val ext = FileNameUtils.getFileExtension("avatar.png")

val shortUuid = UUIDUtils.generateBase64Compressed()
val code = RandomStringUtils.get(6)

val e164 = PhoneNumberUtils.toE164("13800000000")

val map = dto.toMap()

异常基类

  • MicroException:通用运行时异常基类。
  • MicroHttpException:携带 HTTP 状态码的异常。
  • MicroProblemDetailException:携带 title/detail 的问题详情异常(可用于转换为 RFC 9457 响应)。