插件介绍
使用方式
安装
请使用这个版本:~~easy-yapi.2.1.3.183.0.jar~~
https://github.com/tangcent/easy-yapi/releases/download/v2.1.3/easy-yapi.2.1.3.183.0.jar
rpc接口导入支持以下使用方法
- 打开项目中的包含rpc的文件或者在IDEA的左边项目文件区域选择文件或者文件夹 使用快捷键
alt shift E(windows)/ctrl E(mac)
然后选择要导出的API,选择导出渠道Yapi/Markdown
点击[✔]按钮或者按回车键完成导出 - 打开项目中的包含rpc的文件 右键文件内容选择
Generate...
或者用[Alt + Insert]/[Ctrl+Enter]
(快捷键可能不一样)" 然后选择ExportYapi/ExportMarkdown
- 在IDEA的左边项目文件区域选择文件或者文件夹 鼠标点击最上方Code > ExportYapi/ExportMarkdown
rpc相关规则
规则的key | 规则目标(上下文) | 版本 | 规则描述 |
---|---|---|---|
☆mdoc.class.filter | class | v0.9.5+ | 选择哪些类可以导出方法文档(rpc) |
mdoc.method.filter | method | v0.9.5+ | 选择哪些方法可以导出方法文档(rpc) |
☆mdoc.method.path | method | v0.9.5+ | 设置方法文档(rpc)的路径 |
mdoc.method.http.method | method | v0.9.5+ | 设置方法文档(rpc)HTTP请求方式 |
点击规则配置查看更多.
**导出rpc方法的功能默认是关闭的 , 开启需要勾选:Preferences(Settings) > Other Settings > EasyApi > Support > methodDoc**
, 参见:IDEA配置- rpc文档支持导出到
yapi
/markdown
rest接口导入
支持以下使用方法
- 打开项目中的包含api/rpc的文件或者在IDEA的左边项目文件区域选择文件或者文件夹 使用快捷键
alt shift E(windows)/ctrl E(mac)
然后选择要导出的API,选择导出渠道Yapi
点击[✔]按钮或者按回车键完成导出 - 打开项目中的包含api/rpc的文件 右键文件内容选择
Generate...
或者用[Alt + Insert]/[Ctrl+Enter]
(快捷键可能不一样)" 然后选择ExportYapi
- 在IDEA的左边项目文件区域选择文件或者文件夹 鼠标点击最上方Code > ExportYapi
- 鼠标点击最上方Code > YapiDashBoard 然后就可以用鼠标将左边的API拖动到右边yapi目录中,完成API导出到Yapi
项目中使用
在项目根路径加入 .easy.api.config
文件
代码注释配置
类注释
/**
* 前置网关配置中心方案设计
*
* @author Khalid
* @version V1.0
* @since 2021-03-02 09:13
*/
@RestController
public class GatewayConfigCenterController {
}
方法注释
/**
* 获取业务通用配置
*
* @param interchangeableConfigQueryParam
* @return
* @folder 自助终端配置中心方案设计
*/
@PostMapping("/gateway/configcenter/getInterchangeableConfig")
@ResponseBody
public Result<List<InterchangeableConfigVO>> getInterchangeableConfig(
@RequestBody InterchangeableConfigQueryParam interchangeableConfigQueryParam) {
return Results.success(new ArrayList<>());
}
字段注释
package com.khalidlife.demo.schemedesign.controller.param;
import java.util.List;
import javax.validation.constraints.NotBlank;
import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;
/**
* 通用配置入参
*
* @author Khalid
* @version V1.0
* @since 2021-03-02 10:05
*/
@FieldDefaults(level = AccessLevel.PRIVATE)
@Data
public class InterchangeableConfigQueryParam {
/**
* 医院ID(虚拟结算长编号)
*/
@NotBlank(message = "医院ID不能为空")
String corpCode;
/**
* 渠道ID
*/
Long channelId;
/**
* 分组id
*/
Long groupId;
/**
* config key列表
*/
List<String> configKeys;
}
easy.api.config文件配置
# Yapi mock规则:通过字段名及类型等特征来配置mock规则
## 增加自定义mock规则
#mockjs官方示例: http://mockjs.com/examples.html
#定义一些基础的规则
#中国手机号
phone=1@pick(["34","35","36","37","38","39","50","5","52","58","59","57","82","87","88","70","47","30","3","32","55","56","85","86","33","53","80","89"])@string("number", 8)
#毫秒时间戳
mtimestamp=@now('T')
#0-9
digit=@natural(0,9)
#小于1000的自然数
natural_lt_1000=@natural(0,1000)
#小数点后两位
float_with_two=@natural(0,10000).@natural(0,100)
#http url
http_url=@pick(["http","https"])://www.@domain()/@string('lower',1,8)?@string('lower',2,4)=@string('number',1,2)
#objectId 只是字符和位数,不满足具体协议
objectId=@string("0123456789abcdef",24,24)
# module
#用于API分组
#当无配置生效时, 默认使用当前模块/项目名
#导出postman时,将为每个module创建一个文件夹
#导出yapi时,每个module对应yapi中的一个项目
#module=方案设计接口描述
# ignore
#用于忽略class/method,不进行解析
#注释在class上时,整个类将被忽略
#注释在method上时,当前方法将被忽略
ignore=#ignore
# json.rule.field.name
#用于设置输出/输入的字段名(用于json中字段名与类中字段名不一致)
#Support for Jackson annotations
json.rule.field.name=@com.fasterxml.jackson.annotation.JsonProperty#value
#Support for Gson annotations
#json.rule.field.name=@com.google.gson.annotations.SerializedName#value
# json.rule.field.ignore
#忽略字段(设置某些字段不出现在json中,或不需要请求时给出)
#deprcated, see field.ignore
#Support for Jackson annotations
json.rule.field.ignore=@com.fasterxml.jackson.annotation.JsonIgnore#value
#Support for Gson annotations
#json.rule.field.ignore=!@com.google.gson.annotations.Expose#serialize
# field.ignore
#忽略字段(设置某些字段不出现在json中,或不需要请求时给出)
#Support for Jackson annotations
field.ignore=@com.fasterxml.jackson.annotation.JsonIgnore#value
#Support for Gson annotations
#field.ignore=!@com.google.gson.annotations.Expose#serialize
# json.rule.convert
#The ObjectId and Date are parsed as strings
json.rule.convert[org.bson.types.ObjectId]=java.lang.String
json.rule.convert[java.util.Date]=java.lang.String
json.rule.convert[java.sql.Timestamp]=java.lang.String
json.rule.convert[java.time.LocalDateTime]=java.lang.String
json.rule.convert[java.time.LocalDate]=java.lang.String
#resolve HttpEntity/RequestEntity/ResponseEntity
###set resolveProperty = false
json.rule.convert[#regex:org.springframework.http.HttpEntity]=java.lang.Object
json.rule.convert[#regex:org.springframework.http.HttpEntity<(.*?)>]=${1}
json.rule.convert[#regex:org.springframework.http.RequestEntity<(.*?)>]=${1}
json.rule.convert[#regex:org.springframework.http.RequestEntity]=java.lang.Object
json.rule.convert[#regex:org.springframework.http.ResponseEntity<(.*?)>]=${1}
json.rule.convert[#regex:org.springframework.http.ResponseEntity]=java.lang.Object
###set resolveProperty = true
# field.doc(doc.field)
#字段的额外注释
#deprecated info(java)
field.doc[#deprecated]=groovy:"\n「已废弃」" + it.doc("deprecated")
field.doc[@java.lang.Deprecated]=「已废弃」
#deprecated info(kotlin)
field.doc[@kotlin.Deprecated]=groovy:"\n「已废弃」" + it.ann("kotlin.Deprecated","message")
# method.doc(doc.method)
#方法(API)的额外注释
#deprecated info(java)
method.doc[#deprecated]=groovy:"\n「已废弃」" + it.doc("deprecated")
method.doc[@java.lang.Deprecated]=「已废弃」
method.doc[groovy:it.containingClass().hasDoc("deprecated")]=groovy:"\n「已废弃」" + it.containingClass().doc("deprecated")
method.doc[groovy:it.containingClass().hasAnn("java.lang.Deprecated")]=「已废弃」
#deprecated info(kotlin)
#method.doc[@kotlin.Deprecated]=groovy:"\n「已废弃」" + it.ann("kotlin.Deprecated","message")
#method.doc[groovy:it.containingClass().hasAnn("kotlin.Deprecated")]=groovy:"\n「已废弃」 " + it.containingClass().ann("kotlin.Deprecated","message")
# param.doc(doc.param)
#参数的额外注释
param.doc=groovy:"类型:"+tool.uncapitalize(it.type().name().replace("java.lang.",""))
# param.required
#用于标记API参数是否为必须(即不可为空)
#Support for javax.validation annotations
param.required=@javax.validation.constraints.NotBlank
param.required=@"javax.validation.constraints.NotNull
param.required=@javax.validation.constraints.NotEmpty
# field.required
#用于标记字段是否为必须(即不可为空)
#Support for javax.validation annotations
field.required=@"javax.validation.constraints.NotBlank
field.required=@javax.validation.constraints.NotNull
field.required=@javax.validation.constraints.NotEmpty
# field.mock
#用于生成yapi相关mock信息
# mock for javax.validation
###set resolveMulti = first
# define var
number_min=-9999
number_max=9999
float_dmin=2
java_integer_types=["java.lang.Integer","int","java.lang.Long","long","java.lang.Short","short","java.math.BigInteger"]
java_float_types=["java.lang.Float","float","java.lang.Double","double","java.math.BigDecimal"]
# mock_integer_or_float=${java_integer_types}.contains(it.type().name())?"@integer":"@float"
# AssertTrue|AssertFalse|Email
field.mock[@javax.validation.constraints.AssertTrue]=true
field.mock[@javax.validation.constraints.AssertFalse]=false
field.mock[@javax.validation.constraints.Email]=groovy:"@email"
#
## Positive&PositiveOrZero
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Positive")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(1,${number_max})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.PositiveOrZero")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,${number_max})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Positive")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0.01,${number_max},${float_dmin})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.PositiveOrZero")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,${number_max},${float_dmin})"
#
## Negative&NegativeOrZero
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Negative")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(${number_min},-1)"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.NegativeOrZero")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(${number_min},0)"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Negative")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(${number_min},0.01,${float_dmin})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.NegativeOrZero")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(${number_min},0,${float_dmin})"
#
## Max+Min
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&.hasAnn("javax.validation.constraints.Min")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.Min")+","+it.ann("javax.validation.constraints.Max")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&.hasAnn("javax.validation.constraints.Min")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.Min")+","+it.ann("javax.validation.constraints.Max")+",${float_dmin})"
#
## Max|Min
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,"+it.ann("javax.validation.constraints.Max")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Min")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.Min")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,"+it.ann("javax.validation.constraints.Max")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Min")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.Min")+")"
#
## DecimalMax+DecimalMin
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&.hasAnn("javax.validation.constraints.DecimalMin")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.DecimalMin")+","+it.ann("javax.validation.constraints.DecimalMax")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&.hasAnn("javax.validation.constraints.DecimalMin")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.DecimalMin")+","+it.ann("javax.validation.constraints.DecimalMax")+",${float_dmin})"
#
## DecimalMax|DecimalMin
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,"+it.ann("javax.validation.constraints.DecimalMax")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMin")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.DecimalMin")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,"+it.ann("javax.validation.constraints.DecimalMax")+",${float_dmin})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMin")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.DecimalMin")+",${float_dmin})"
###set resolveMulti = error
# field.default.value(v1.7.1+)
#用于设置字段的默认值
field.default.value=#default
# api.open
#标记接口是否公开
api.open=#open
# api.status
#标记接口status
#yapi status
api.status[#undone]=undone
api.status[#todo]=undone
# mdoc.class.filter
#用于选择哪些类可以导出方法(rpc)文档, 根据当前项目情况
#如果所有的RPC接口类都以Client结尾, 则可配置:
mdoc.class.filter=groovy:it.name().endsWith("Client")
#如果所有的RPC接口类包都在a.b.c.client, 则可配置:
mdoc.class.filter=groovy:it.name().startsWith("a.b.c.client")
# constant.field.ignore
#忽略常量字段
#ignore serialVersionUID
constant.field.ignore=groovy:it.name()=="serialVersionUID"
# method.return.main
#此配置仅设置返回值的核心主体,使得@return的注释落在主体属性上,不影响返回类型及字段.
method.return.main[groovy:it.returnType().isExtend("com.khalidlife.demo.schemedesign.common.domain.Result")]=data
# method.return
#为了方便书写,我们可以尝试使用{@link}来设置实际响应类型,利用helper.resolveLink来解析
method.return[#real_return]=groovy: helper.resolveLink(it.doc("real_return"))
#/**
# * @real_return {@link Result<UserInfo>}
# */
#更进一步的,如果所有的响应都由com.itangcent.common.dto.Result包装
#method.return[#real_return]=groovy: "com.khalidlife.demo.schemedesign.common.domain.Result<" + helper.resolveLink(it.doc("real_return")) +">"
#/**
# * @real_return {@link UserInfo}
# */
# folder.name
# 用于设置API所属文件夹的名称
# 缺省情况下,默认使用api所在类作为所属文件夹
# read folder name from tag `folder`
folder.name=#folder
#使用方法:方法上加注释
#/**
# * @folder Mock字符串
# */
RPC项目配置
工具配置页
待补充…
easy.api.config文件配置
module=cloud-medical-service-client
# mdoc.class.filter
#用于选择哪些类可以导出方法(rpc)文档, 根据当前项目情况
#如果所有的RPC接口类都以Client结尾, 则可配置:
#mdoc.class.filter=groovy:it.name().endsWith("Service")
#如果所有的RPC接口类包都在a.b.c.client, 则可配置:
mdoc.class.filter=groovy:it.name().startsWith("com.yuantu.cloud.hospital.cm.service.client.service")
# constant.field.ignore
#忽略常量字段
#ignore serialVersionUID
constant.field.ignore=groovy:it.name()=="serialVersionUID"
# method.return.main
#此配置仅设置返回值的核心主体,使得@return的注释落在主体属性上,不影响返回类型及字段.
method.return.main[groovy:it.returnType().isExtend("com.yuantu.lego.module.api.convention.data.domain.Result")]=data
# folder.name
# 用于设置API所属文件夹的名称
# 缺省情况下,默认使用api所在类作为所属文件夹
# read folder name from tag `folder`
folder.name=#folder
#使用方法:方法上加注释
#/**
# * @folder Mock字符串
# */
# mock规则
# Yapi mock规则:通过字段名及类型等特征来配置mock规则
## 增加自定义mock规则
#mockjs官方示例: http://mockjs.com/examples.html
#定义一些基础的规则
#中国手机号
phone=1@pick(["34","35","36","37","38","39","50","5","52","58","59","57","82","87","88","70","47","30","3","32","55","56","85","86","33","53","80","89"])@string("number", 8)
#毫秒时间戳
mtimestamp=@now('T')
#0-9
digit=@natural(0,9)
#小于1000的自然数
natural_lt_1000=@natural(0,1000)
#小数点后两位
float_with_two=@natural(0,10000).@natural(0,100)
#http url
http_url=@pick(["http","https"])://www.@domain()/@string('lower',1,8)?@string('lower',2,4)=@string('number',1,2)
#objectId 只是字符和位数,不满足具体协议
objectId=@string("0123456789abcdef",24,24)
# ignore
#用于忽略class/method,不进行解析
#注释在class上时,整个类将被忽略
#注释在method上时,当前方法将被忽略
ignore=#ignore
# method.doc(doc.method)
#方法(API)的额外注释
#deprecated info(java)
method.doc[#deprecated]=groovy:"\n「已废弃」" + it.doc("deprecated")
method.doc[@java.lang.Deprecated]=「已废弃」
method.doc[groovy:it.containingClass().hasDoc("deprecated")]=groovy:"\n「已废弃」" + it.containingClass().doc("deprecated")
method.doc[groovy:it.containingClass().hasAnn("java.lang.Deprecated")]=「已废弃」
###set resolveMulti = first
# define var
number_min=-9999
number_max=9999
float_dmin=2
java_integer_types=["java.lang.Integer","int","java.lang.Long","long","java.lang.Short","short","java.math.BigInteger"]
java_float_types=["java.lang.Float","float","java.lang.Double","double","java.math.BigDecimal"]
# mock_integer_or_float=${java_integer_types}.contains(it.type().name())?"@integer":"@float"
# AssertTrue|AssertFalse|Email
field.mock[@javax.validation.constraints.AssertTrue]=true
field.mock[@javax.validation.constraints.AssertFalse]=false
field.mock[@javax.validation.constraints.Email]=groovy:"@email"
#
## Positive&PositiveOrZero
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Positive")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(1,${number_max})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.PositiveOrZero")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,${number_max})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Positive")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0.01,${number_max},${float_dmin})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.PositiveOrZero")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,${number_max},${float_dmin})"
#
## Negative&NegativeOrZero
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Negative")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(${number_min},-1)"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.NegativeOrZero")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(${number_min},0)"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Negative")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(${number_min},0.01,${float_dmin})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.NegativeOrZero")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(${number_min},0,${float_dmin})"
#
## Max+Min
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&.hasAnn("javax.validation.constraints.Min")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.Min")+","+it.ann("javax.validation.constraints.Max")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&.hasAnn("javax.validation.constraints.Min")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.Min")+","+it.ann("javax.validation.constraints.Max")+",${float_dmin})"
#
## Max|Min
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,"+it.ann("javax.validation.constraints.Max")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Min")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.Min")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Max")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,"+it.ann("javax.validation.constraints.Max")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.Min")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.Min")+")"
#
## DecimalMax+DecimalMin
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&.hasAnn("javax.validation.constraints.DecimalMin")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.DecimalMin")+","+it.ann("javax.validation.constraints.DecimalMax")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&.hasAnn("javax.validation.constraints.DecimalMin")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.DecimalMin")+","+it.ann("javax.validation.constraints.DecimalMax")+",${float_dmin})"
#
## DecimalMax|DecimalMin
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer(0,"+it.ann("javax.validation.constraints.DecimalMax")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMin")&&${java_integer_types}.contains(it.jsonType().name())]=groovy:"@integer("+it.ann("javax.validation.constraints.DecimalMin")+")"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMax")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float(0,"+it.ann("javax.validation.constraints.DecimalMax")+",${float_dmin})"
#field.mock[groovy:it.hasAnn("javax.validation.constraints.DecimalMin")&&${java_float_types}.contains(it.jsonType().name())]=groovy:"@float("+it.ann("javax.validation.constraints.DecimalMin")+",${float_dmin})"
###set resolveMulti = error
# field.default.value(v1.7.1+)
#用于设置字段的默认值
field.default.value=#default
# api.open
#标记接口是否公开
api.open=#open
# api.status
#标记接口status
#yapi status
api.status[#undone]=undone
api.status[#todo]=undone
# 设置方法文档(rpc)HTTP请求方式, 默认POST
mdoc.method.http.method=groovy:it.argCnt()==0?"GET":null