插件介绍

使用方式

安装

安装方式

rpc 接口导入支持以下使用方法

  1. 打开项目中的包含 rpc 的文件或者在 IDEA 的左边项目文件区域选择文件或者文件夹 使用快捷键alt shift E(windows)/ctrl E(mac) 然后选择要导出的 API,选择导出渠道Yapi/Markdown 点击[✔]按钮或者按回车键完成导出
  2. 打开项目中的包含 rpc 的文件 右键文件内容选择Generate...或者用[Alt + Insert]/[Ctrl+Enter](快捷键可能不一样)” 然后选择ExportYapi/ExportMarkdown
  3. 在 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 请求方式

点击规则配置查看更多.


  • **<font style="color:#F5222D;">导出rpc方法的功能默认是关闭的 , 开启需要勾选:Preferences(Settings) > Other Settings > EasyApi > Support > methodDoc</font>** , 参见:IDEA 配置
  • rpc 文档支持导出到yapi/markdown

rest 接口导入

支持以下使用方法

  1. 打开项目中的包含 api/rpc 的文件或者在 IDEA 的左边项目文件区域选择文件或者文件夹 使用快捷键alt shift E(windows)/ctrl E(mac) 然后选择要导出的 API,选择导出渠道Yapi 点击[✔]按钮或者按回车键完成导出
  2. 打开项目中的包含 api/rpc 的文件 右键文件内容选择Generate...或者用[Alt + Insert]/[Ctrl+Enter](快捷键可能不一样)” 然后选择ExportYapi
  3. 在 IDEA 的左边项目文件区域选择文件或者文件夹 鼠标点击最上方 Code > ExportYapi
  4. 鼠标点击最上方 Code > YapiDashBoard 然后就可以用鼠标将左边的 API 拖动到右边 yapi 目录中,完成 API 导出到 Yapi

  • 初次使用可能会以弹窗的方式要求输入必要的信息,参见:yapi 配置
  • 熟悉后可以尝试:yapi mock

项目中使用

在项目根路径加入 .easy.api.config 文件

代码注释配置

类注释

1
2
3
4
5
6
7
8
9
10
/**
* 前置网关配置中心方案设计
*
* @author Khalid
* @version V1.0
* @since 2021-03-02 09:13
*/
@RestController
public class GatewayConfigCenterController {
}

方法注释

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 获取业务通用配置
*
* @param interchangeableConfigQueryParam
* @return
* @folder 自助终端配置中心方案设计
*/
@PostMapping("/gateway/configcenter/getInterchangeableConfig")
@ResponseBody
public Result<List<InterchangeableConfigVO>> getInterchangeableConfig(
@RequestBody InterchangeableConfigQueryParam interchangeableConfigQueryParam) {
return Results.success(new ArrayList<>());
}

字段注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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 文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# 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 文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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