常用Swagger注解汇总
常用Swagger注解汇总
前言
在实际编写后端代码的过程中,我们可能经常使用到 swagger 注解,但是会用不代表了解,你知道每个注解都有什么属性吗?你都用过这些属性吗?了解它们的作用吗?本文在此带大家总结一下常用的swagger注解,供大家学习理解。
文章目录
- 常用Swagger注解汇总
- 控制器层
- @Api
- @ApiOperation
- @ApiImplicitParam
- @ApiImplicitParams
- @ApiParam
- 实体层
- @ApiModel
- @ApiModelProperty
控制器层
@Api
介绍
此注解应用于类、接口或者枚举上,启动应用时被标注的类会扫描到 swagger 源中。默认情况下,swagger 核心仅扫描带有 @Api
注解的类而无视其他的源数据 (例如:JAX-RS 端口、Serlvet 等等)
不能标注在方法上且一般不单独使用,常见的做法是搭配 @ApiOperation
注解,作为业务接口类的说明。
源码
package io.swagger.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Api {String value() default "";String[] tags() default "";@Deprecated String description() default "";@Deprecated String basePath() default "";@Deprecated int position() default 0;String produces() default "";String consumes() default "";String protocols() default "";Authorization[] authorizations() default @Authorization(value = "");boolean hidden() default false;
}
属性
从源码我们可以看到 @Api
注解除了已废弃的3个,共有 7 个属性,不过这里面只有下面这1个属性比较常用:
1、tags (接口业务所属分组)
这是一个用于控制 API 文档标签的列表,标签可按资源或者其他标识符对操作进行分组。该属性就是对实现相同业务功能的接口类做一个大致的分组,该分组中包括相同业务功能下的所有接口。
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 测试方法*/@ApiOperation("测试方法")@GetMapping("/test")public R<Void> testApi(){System.out.println("Hello,world");return ok();}
}
说完了常用的属性,我们再来补充一下剩下的一些不常用属性:
属性 | 数据类型 | 默认值 | 作用 | 示例 | 说明 |
---|---|---|---|---|---|
value | String | “” | 接口分组说明,在实际开发中并不常用,且值会被 tags 属性覆盖 | @Api(value = “操作名称”) 或 @Api(“操作名称”) | 隐式地设置操作标签 (即操作名称),旧版本支持 (阅读描述)。 在 Swagger 核心 1.3.X 的版本中,此属性仅作为主机 API 资源的声明路径,到 1.5.X 版本之后就不再关联了。 |
hidden | boolean | false | 隐藏该分组下的所有接口。此外要注意的是,接口的显示隐藏应该根据特定的安全策略和特定客户需求来确定 | @Api(hidden = true) | 隐藏资源下的操作。此属性的值默认为 false,当设置为 true 时,该分组的所有操作都会在 swagger 文档中被隐藏,适用于接口暂时不需要使用时的情况。 |
produces | String | “” | 指定的content-type 的输出 | @Api(produces=“application/json”) | 此属性在新版本的 swagger 中已不再使用,仅用于向下兼容旧版本。对应此资源下操作生成的字段。 获取逗号分割的内容类型值,例如,“application/json”,“application/xml” 将会提醒操作生成 JSON 或 XML 输出。 对于 JAX-RS 资源,如果存在将会自动获取 @Produces 注解的值,同时也可用于覆盖 Swapper 文档的 @Produces 的值。 |
consumes | String | “” | 指定的content-type 的输入 | @Api(consumes=“application/xml”) | 对应此资源下操作消费的字段。 获取逗号分割的内容类型值。例如例如,“application/json”,“application/xml” 将会提醒操作接收 JSON 或 XML 输入。 对于 JAX-RS 资源,如果存在将会自动获取 @Consumes 注解的值,同时也可用于覆盖 Swagger 文档的 @Consumes 的值。 |
protocols | String | “” | 网络请求协议 | @Api(protocols = “http,https”) | 设置此资源下操作的指定协议(或方案)。 以逗号分割可用的协议值,可用值:http, https, ws, wss |
authorizations | Authorization[] | @Authorization(value = “”) | 规定接口分组的授权方案 | 对应操作对象的安全字段。 获取此资源下操作的授权 (安全需求) 列表,这可能会被特定的操作覆盖。 |
@ApiOperation
介绍
@ApiOperation
注解可应用于方法或类上,通常标注在方法上作为业务接口的名称,描述其操作或者描述针对于特定路径的 HTTP 方法。默认情况下,具有相同效果的操作被分组在一个单独的操作对象中,而 HTTP 方法和路径的组合将会创建一个独一无二的操作。此外,此注解提供了丰富的属性来允许我们自定义接口的描述信息,包括接口名称和所属分组等。
源码
package io.swagger.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiOperation {String value();String notes() default "";String[] tags() default "";Class<?> response() default Void.class;String responseContainer() default "";String responseReference() default "";String httpMethod() default "";@Deprecated int position() default 0;String nickname() default "";String produces() default "";String consumes() default "";String protocols() default "";Authorization[] authorizations() default @Authorization(value = "");boolean hidden() default false;ResponseHeader[] responseHeaders() default @ResponseHeader(name = "", response = Void.class);int code() default 200;Extension[] extensions() default @Extension(properties = @ExtensionProperty(name = "", value = ""));boolean ignoreJsonView() default false;
}
属性
从源码我们可以看到 @ApiOperation
注解除了已废弃的1个,共有 17 个属性。不过这里面只有以下 2 个属性比较常用:
1、value (接口名称)
对应操作的摘要字段。此属性提供接口的简要描述(即接口说明),最多 120 个字符或者少于 Swagger-UI
页面可展示的。
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 获取信息*/@ApiOperation("获取信息")@GetMapping("/getInfo")public R<Integer> getInfo() {int i = 1;return R.ok(i);}
}
2、notes (接口描述)
对应操作的详情字段。这是一段冗长的操作描述,没有字数限制,通常适用于当 value
属性无法解释清楚时对接口操作的补充说明。
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 获取信息*/@ApiOperation(value = "获取信息", notes = "用于获取信息的接口")@GetMapping("/getInfo")public R<Integer> getInfo() {int i = 1;return R.ok(i);}
}
说完了常用的属性,我们再来补充一下剩下的一些不常用属性:
属性 | 数据类型 | 默认值 | 作用 | 示例 | 说明 |
---|---|---|---|---|---|
tags | String[] | “” | 定义接口分组,如果一个接口涉及到多个业务场景,那这个时候需要我们对接口进行多个分组 | @ApiOperation(tags={“测试标签1”, “测试标签2”}) | 一个用于控制 API 文档标签的列表,标签可按资源或者其他标识符对操作进行分组。此外,操作的 Api 注解的 value 或者 tags 属性将会覆盖其单个的非空值。 |
response | Class<?> | Void.class | 指定响应的数据类型 | @ApiOperation(response = ReturnResult.class) | 操作返回的响应类型 在 JAX-RS 应用程序中,方法的返回类型将会自动使用,除了 javax.ws.core.Response 。而在其他情况下,操作返回类型默认为 void ,因为不知道实际的响应类型。设置此属性将会覆盖任何自动派生的数据类型 如果被用到的值是用一个类 (Integer、Long) 的基本数据类型表示的,那么则会使用相应的基本数据类型响应 |
responseContainer | String | “” | 包装HTTP响应的容器类型 | @ApiOperation(responseContainer= “List”) | 声明一个包装响应的容器,有效值只有 “List”、“Set”、“Map”,其他值都会被忽略。 |
responseReference | String | “” | 支持远程调用的响应数据类型,比 response 属性优先级更高 | @ApiOperation(responseReference= “java.lang.Integer”) | 指定一个响应类型的引用。此引用可以是本地的或者远程的并且将按原样使用,覆任何的指定的 response 属性类 |
httpMethod | String | “” | 接口使用的HTTP方法 | @ApiOperation(httpMethod= “GET”) | 对应使用的HTTP方法 如果是无状态的,在 JAX-RS 应用程序中,下列 JAX-RS 注解将会被扫描且使用:@GET、@HEAD、@POST、@PUT、@DELETE 和 @OPTIONS。注意即使它不是 JAX-RS规范指定的部分(也可以被扫描并使用),如果您创建并使用 @PATCH 注解,它也会被解析并使用,如果设置了此属性,那么将会覆盖 JAX-RS 注解。 对于 Sevlet 而言,您必须手动指定 HTTP 方法,可接收的值是 “GET”、“HEAD”、“POST”、“PUT”、“DELETE”、“GET”、“DELETE” 和 “PATCH”。 |
nickname | String | “” | 接口别名,方便前后端沟通使用,没有其他含义 | @ApiOperation(nickname= “测试别名”) | 对应操作 ID 字段。 此操作 ID 被用于第三方工具唯一识别此操作的手段,在 Swagger 2.0 中,这不是必填参数,如果不提供值可以为空。 |
produces | String | “” | 指定的content-type 的输出 | @ApiOperation(produces=“application/json”) | 对应此资源下操作生成的字段。 获取逗号分割的内容类型值,例如,“application/json”,“application/xml” 将会提醒操作生成 JSON 或 XML 输出。 对于 JAX-RS 资源,如果存在将会自动获取 @Produces 注解的值,同时也可用于覆盖 Swapper 文档的 @Produces 的值。 |
consumes | String | “” | 指定的content-type 的输入 | @ApiOperation(consumes=“application/xml”) | 对应此资源下操作消费的字段。 获取逗号分割的内容类型值。例如例如,“application/json”,“application/xml” 将会提醒操作接收 JSON 或 XML 输入。 对于 JAX-RS 资源,如果存在将会自动获取 @Consumes 注解的值,同时也可用于覆盖 Swagger 文档的 @Consumes 的值。 |
protocols | String | “” | 网络请求协议 | @ApiOperation(protocols = “http,https”) | 设置此资源下操作的指定协议(或方案)。 以逗号分割可用的协议值,可用值:http, https, ws, wss |
authorizations | Authorization[] | @Authorization(value = “”) | 定义接口的授权方案 | 对应操作对象的安全字段。 获取此资源下操作的授权 (安全需求) 列表,这可能会被特定的操作覆盖。 | |
hidden | boolean | false | 此属性用于隐藏接口,但要注意的是,接口的显示隐藏应该根据特定的安全策略和特定客户需求来 | @ApiOperation(hidden= true) | 操作列表中隐藏此操作 |
responseHeaders | ResponseHeader[] | @ResponseHeader(name = “”, response = Void.class) | HTTP响应头参数 | @ApiOperation(responseHeaders = {@ResponseHeader(name = “auth”, response = String.class)}) | 在响应中可能提供的响应头列表 |
code | int | 200 | HTTP状态码,swagger自动生成,一般不用设置 | @ApiOperation(code = 404) | HTTP 响应状态码,其值应该是正式 HTTP 状态码定义的其中之一 |
extensions | Extension[] | @Extension(properties = @ExtensionProperty(name = “”, value = “”)) | 可选的扩展属性数组 | @ApiOperation(extensions = @Extension(properties = @ExtensionProperty(name = “key”, value = “value”))) | 可选的扩展属性数组 |
ignoreJsonView | boolean | false | 忽略JsonView 注解 | @ApiOperation(ignoreJsonView = true) | 当解析操作和类型时忽略 @JsonView 注解,用于向后兼容 |
@ApiImplicitParam
前言
此注解只能标注在方法上,代表了方法中的一个独立的参数,如果方法有多个参数,可以和 @ApiImplicitParams
注解搭配使用。
当 ApiParam
注解绑定了一个 JAX-RS 的参数、方法、或者字段时,它允许您以微调的方式手动定义一个参数。这是当使用 Servlet 或者其他非 JAX-RS 环境时定义参数的唯一方法。
此注解和 @ApiParam
注解一样都可以应用于方法参数上,不过 @ApiParam
更适用于参数不是包装类或者 String
的情况,此时配合 @ApiModel
和@ApiModelProperty
再好不过,而 @ApiImplicitParam 通常适用于方法中有单个或多个参数且不是通过一个类去接收所有参数的情况,这时候使用它,非常合适。
源码
package io.swagger.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiImplicitParam {String name() default "";String value() default "";String defaultValue() default "";String allowableValues() default "";boolean required() default false;String access() default "";boolean allowMultiple() default false;String dataType() default "";Class<?> dataTypeClass() default Void.class;String paramType() default "";String example() default "";Example examples() default @Example(value = @ExampleProperty(mediaType = "", value = ""));String type() default "";String format() default "";boolean allowEmptyValue() default false;boolean readOnly() default false;String collectionFormat() default "";
}
从源码我们可以看到 @ApiImplicitParam
注解共有 17 个属性。不过这里面只有以下 2 个属性比较常用:
1、name (参数名称)
此属性表示参数的名称。为了保持适当的 Swagger 功能,当根据 parameType() (指参数类型) 命名参数时,请遵循以下规则:
(1)、如果参数类型是路径,其名称应当是路径中所关联的那部分 (相对路径)
(2)、对于所有的其他情况,其名称应当是当前应用程序希望接收的
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 打印消息** @param msg 待打印的消息*/@ApiOperation("打印消息")@ApiImplicitParams({@ApiImplicitParam(name = "msg"),@ApiImplicitParam(name = "author")})@GetMapping("/print")public R<String> printMsg(String msg, String author) {log.info("这是您发送的消息:{}", msg);return R.ok(msg);}
}
2、value (参数说明)
这是一个简短的参数描述。
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 展示方法*/@ApiOperation("展示方法")@ApiImplicitParam(name = "request", value = "HTTP请求")@GetMapping("/show")public R<String> show(HttpServletRequest request) {String method = request.getMethod();return R.ok(method);}
}
3、allowableValues (参数范围)
限制此参数接收的值,以下有三种方法可以描述请求参数的范围:
(1)、设置一个值的列表,提供一个以逗号分割的列表。例如:first, second, third。
(2)、设置一个值的范围,以 “range” 开始这个值,周围用方括号表示最小值和最大值,或使用圆括号表示独占的最小值和最大值。例如:range[1, 5]、range(1, 5), range[1, 5)。注意,此属性需要配合 dataTypeClass
属性才有用,单独设置没有效果
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 获取随机数* @param seed 随机数种子*/@ApiOperation("获取随机数")@ApiImplicitParam(name = "seed", value = "随机数种子", allowableValues = "1,2,3,4,5,6,7,8,9,10", dataTypeClass = Integer.class)@GetMapping("/random")public R<Integer> random(Integer seed) {Random random = new Random(seed);int i = random.nextInt();return R.ok(i);}}
当使用swagger文档调用接口也可以看到:
4、required (参数是否必填)
指定参数为必要的还是非必要的,如果当前参数为path参数,应当设置此属性为true。
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 获取用户信息*/@ApiOperation("获取用户信息")@ApiImplicitParam(name = "userId", value = "用户ID", required = true)@GetMapping("/info/{userId}")public R<Void> getUserInfo(@PathVariable("userId") Long userId) {return ok();}
}
说完了常用的属性,我们再来补充一下剩下的一些不常用属性:
属性 | 数据类型 | 默认值 | 概述 | 示例 | 说明 |
---|---|---|---|---|---|
defaultValue | String | “” | 参数默认值 | @ApiImplicitParam(defaultValue = “1”) | 描述参数的默认值,当请求参数中有分页参数或有需要设置默认值的参数,可设置此属性 |
access | String | “” | 允许API文档过滤参数,更多细节请查看 SwaggerSpecFilter 类 | ||
allowMultiple | String | “” | 此参数是否能接受多个值 | @ApiImplicitParam(allowMultiple= true) | 指定此参数是否能在各种情况下能够接收多个值,默认值为false |
dataType | String | “” | 数据类型 | @ApiImplicitParam(dataType=“int”) | 参数的数据类型,可以是类名或者基本数据类型 |
dataTypeClass | Class<?> | Void.class | class 类型,此属性不定义的话程序可能会有警告 | @ApiImplicitParam(dataTypeClass = String.class) | 参数的 class 类型,如果此属性指定了值的话会覆盖 dataType 提供的 |
paramType | String | “” | 参数的HTTP参数类型 | @ApiImplicitParam(param=“query”) | 参数的参数类型,有效值是 path、query、body、header 或者 form,其他值会被忽略 |
example | String | “” | 参数示例 | @ApiImplicitParam(example=“1”) | 一个非 body 类型的单独参数示例 |
examples | Example | @Example(value = @ExampleProperty(mediaType = “”, value = “”)) | 参数示例集合 | 参数示例,仅适用于body参数 | |
type | String | “” | 参数类型 | @ApiImplicitParam(type = “int”) | 添加了覆盖所检测到的类型的能力 |
format | String | “” | 参数的自定义格式 | @ApiImplicitParam(type = “integer”, format=“int64”) | 添加了提供自定义格式的能力 |
allowEmptyValue | boolean | false | 是否允许传递空值 | @ApiImplicitParam(allowEmptyValue=true) | 添加了设置空值格式的能力 |
readOnly | boolean | false | 是否只读 | @ApiImplicitParam(readOnly=true) | 添加了被认定为只读的能力 |
collectionFormat | String | “” | 集合的格式 | 添加了使用数组类型覆盖集合格式的能力 |
@ApiImplicitParams
介绍
此注解是 @ApiImplicitParam 注解的包装器,单独使用没有意义,必须和 @ApiImplicitParam 进行搭配,当接口方法中有一个及以上的参数时可以使用。
源码
package io.swagger.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiImplicitParams {ApiImplicitParam[] value();
}
从源码我们可以看到 @ApiImplicitParams
注解有且只有一个常用的属性:
1、value(注解列表)
一个用于API操作的 ApiImplicitParam 注解的列表
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 登录*/@ApiOperation("登录")@ApiImplicitParams({@ApiImplicitParam(name = "username", value = "用户名", required = true),@ApiImplicitParam(name = "password", value = "密码", required = true)})@GetMapping("/login")public R<Void> login(String username, String password) {return ok();}
}
@ApiParam
介绍
@ApiParam
注解作用在接口方法上面,以及接口方法中的参数位置的注解,其主要作用是用来给接口中的参数定义相关的参数说明,旨在帮助相关技术人员理解接口中每个参数的含义。注意,此注解只能在 JAX-RS 1.x/2.x
注解的组合中使用,和 @ApiImplicitParam
注解同样的是,都可以标注在方法上,对方法的参数进行解释说明。唯一的不同点是,@ApiImplicitParam
注解比 @ApiParam
更适合标注在包装类或 Spring 类上,且配合 @ApiImplicitParams
可以做到支持多个参数,而 @ApiParam
只能有一个。
源码
package io.swagger.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiParam {String name() default "";String value() default "";String defaultValue() default "";String allowableValues() default "";boolean required() default false;String access() default "";boolean allowMultiple() default false;boolean hidden() default false;String example() default "";Example examples() default @Example(value = @ExampleProperty(mediaType = "", value = ""));String type() default "";String format() default "";boolean allowEmptyValue() default false;boolean readOnly() default false;String collectionFormat() default "";
}
属性
从源码我们可以看到 @ApiParam
注解共有 15 个属性。不过这里面只有以下 2 个属性比较常用:
1、name(参数名称)
此属性代表了参数的名称,值可能来自字段、方法或参数名称,应当重写它。
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 打印消息* @param msg 消息*/@ApiOperation("打印消息")@ApiParam(name = "msg")@GetMapping("/printMsg")public R<Void> printMsg(String msg) {System.out.println("msg = " + msg);return ok();}
}
2、value(参数说明)
这是一段简短的参数描述。
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 获取信息* @param msg 消息*/@ApiOperation("获取信息")@ApiParam(name = "msg", value = "消息")@GetMapping("/getInfo")public R<String> getInfo(String msg) {String info = msg + "Hello,world";return ok(info);}}
3、required (是否必填)
指定请求参数是否必填,假如当前参数类型为path则必须设置此属性。
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 获取信息* @param msg 消息*/@ApiOperation("获取信息")@ApiParam(name = "msg", value = "消息", required = true)@GetMapping("/getInfo")public R<String> getInfo(String msg) {String info = msg + "Hello,world";return ok(info);}}
说完了常用的属性,我们再来补充一下剩下的一些不常用属性:
属性 | 数据类型 | 默认值 | 概述 | 示例 | 说明 |
---|---|---|---|---|---|
defaultValue | String | “” | 参数的默认值 | @ApiParam(defaultValue = “1”) | 描述参数的默认值,当请求参数中有分页参数或有需要设置默认值的参数,可设置此属性 |
access | String | “” | 允许API文档过滤参数,更多细节请查看 SwaggerSpecFilter 类 | ||
allowMultiple | boolean | false | 此参数是否能接受多个值 | @ApiParam(allowMultiple= true) | 指定此参数是否能在各种情况下能够接收多个值,默认值为false |
hidden | boolean | false | 控制参数的隐藏或显示 | @ApiParam(hidden = true) | 隐藏参数列表中的此参数 |
example | String | “” | 参数示例 | @ApiParam(example=“1”) | 一个非 body 类型的单独参数示例 |
examples | Example | @Example(value = @ExampleProperty(mediaType = “”, value = “”)) | 参数示例集合 | 参数示例,仅适用于body参数 | |
type | String | “” | 参数类型 | @ApiParam(type = “int”) | 添加了覆盖所检测到的类型的能力 |
format | String | “” | 参数格式 | @ApiParam(type = “integer”, format=“int64”) | 添加了提供自定义格式的能力 |
allowEmptyValue | boolean | false | 是否允许传递空值 | @ApiParam(allowEmptyValue=true) | 添加了设置空值格式的能力 |
readOnly | boolean | false | 是否只读 | @ApiParam(readOnly=true) | 添加了被认定为只读的能力 |
collectionFormat | String | “” | 集合的格式 | 添加了使用数组类型覆盖集合格式的能力 |
Tips
你知道吗?Spring 框架在控制器层面也提供了一些有关于请求参数的注解,通常swagger注解也会配合这些注解一起使用,了解这些注解对你百利而无一害。
注解 说明 @RequestParam Spring的请求参数注解,可以标注在方法参数上,如果前后端参数不对应的话,可以使用此注解进行参数绑定 @RequestBody 将当前参数绑定为请求主体,POST、PUT方法中常用 @RequestHeader 如果方法需要接受请求头参数,那么可以使用此注解,表示当前参数是一个请求头参数 @RequestAttribute 将当前参数绑定为HTTP请求中的一个属性,通过 request.getAttribute() 方法可获取属性值 @RequestPart 可以将 “multipart/form-data” 请求的参数和方法参数进行相关联
实体层
@ApiModel
介绍
为模型或视图对象提供额外的 swagger 说明信息, 被标注的类将会 “ 自我介绍 ”,因为它们在操作中被用作类型,不过程序员们更喜欢着眼于类的内部结构。此注解是作用在接口相关的实体类上的注解,用来对该接口的相关实体类添加额外的描述信息,一般和 @ApiModelProperty 注解配合使用。
源码
package io.swagger.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ApiModel {String value() default "";String description() default "";Class<?> parent() default Void.class;String discriminator() default "";Class<?>[] subTypes() default {};String reference() default "";
}
属性
从源码我们可以看到 @ApiModel
注解共有 6 个属性,不过这里面只有下面这1个属性比较常用:
1、value (模型描述)
为模型提供一个替代名称(替代类名),如果没有标注此属性,默认情况下使用类名。
实体层
/*** 用户对象** @author 莪是男神*/
@Data
@ApiModel("用户信息")
public class UserInfo implements Serializable {private static final long serialVersionUID = 1L;/** 用户ID */private Long userId;/** 部门ID */private Long deptId;/** 用户账号 */private String userName;/** 用户昵称 */private String nickName;/** 用户邮箱 */private String email;/** 手机号码 */private String phonenumber;/** 用户性别 */private String sex;/** 用户头像 */private String avatar;/** 密码 */private String password;/** 帐号状态(0正常 1停用) */private String status;/** 删除标志(0代表存在 2代表删除) */private String delFlag;/** 最后登录IP */private String loginIp;/** 最后登录时间 */private Date loginDate;}
控制器层
/*** swagger注解学习** @author 莪是男神* @date 2023/2/26 1:24*/
@Api(tags = "swagger注解学习")
@Slf4j
@Anonymous
@RestController
@RequestMapping("/annotationLearn")
public class AnnotationLearnController extends BaseController {/*** 获取用户信息** @param userId 用户ID*/@ApiOperation("获取用户")@ApiImplicitParam(name = "userId", value = "用户ID", dataTypeClass = Long.class, paramType = "query", required = true)@GetMapping("/info")public R<UserInfo> getInfo(Long userId) {UserInfo userInfo = new UserInfo();userInfo.setUserId(userId);return R.ok(userInfo);}}
说完了常用的属性,我们再来补充一下剩下的一些不常用属性:
属性 | 数据类型 | 默认值 | 概述 | 示例 | 说明 |
---|---|---|---|---|---|
description | String | “” | 类描述。 在实际开发中,此属性一般会配合 value 属性进行使用,很少会出现只是用 value 属性而不使用 description 属性的情况。 | @ApiMode(description = “系统用户的详细信息”) | 为此模型提供一个冗长的描述 |
parent | Class<?> | Void.class | 描述类的继承关系 | @ApiModel(parent = Object.class) | 为模型提供一个父类,允许描述其中的继承关系 |
discriminator | String | “” | 实现类的多态性 | @ApiModel(discriminator= “userId”) | 此属性用于支持模型继承以及多态性。 其值用作鉴别器的字段名称,基于这个字段,可以断言需要使用哪种子类型 |
subTypes | Class<?>[] | {} | 展示继承接口相关实体类class的子类 | @ApiModel(subTypes={String.class}) | 一个继承此模型的子类数组 |
reference | String | “” | 实体类的类型引用 | 指定对应类型定义的引用,并覆盖所指定的任何其他的元数据 |
@ApiModelProperty
介绍
此注解可标注在方法或字段上,通常配合 @ApiModel 注解一起使用,用于添加或操作接口相关实体类的字段信息
源码
package io.swagger.annotations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiModelProperty {String value() default "";String name() default "";String allowableValues() default "";String access() default "";String notes() default "";String dataType() default "";boolean required() default false;int position() default 0;boolean hidden() default false;String example() default "";@Deprecatedboolean readOnly() default false;AccessMode accessMode() default AccessMode.AUTO;String reference() default "";boolean allowEmptyValue() default false;Extension[] extensions() default @Extension(properties = @ExtensionProperty(name = "", value = ""));enum AccessMode {AUTO,READ_ONLY,READ_WRITE;}
}
属性
从源码我们可以看到 @ApiModelProperty
注解除了已废弃的1个,共有 14 个属性和一个枚举,不过这里面只有下面这1个属性比较常用:
1、value (字段描述)
一段简短的字段描述。
/*** 用户对象** @author 莪是男神*/
@Data
@ApiModel(value = "用户信息")
public class UserInfo {private static final long serialVersionUID = 1L;/** 用户ID */@ApiModelProperty("用户ID")private Long userId;/** 部门ID */@ApiModelProperty("部门ID")private Long deptId;/** 用户账号 */@ApiModelProperty("用户账号")private String userName;/** 用户昵称 */@ApiModelProperty("用户昵称")private String nickName;/** 用户邮箱 */@ApiModelProperty("用户邮箱")private String email;/** 手机号码 */@ApiModelProperty("手机号码")private String phonenumber;/** 用户性别 */@ApiModelProperty("用户性别")private String sex;/** 用户头像 */@ApiModelProperty("用户头像")private String avatar;/** 密码 */@ApiModelProperty("密码")private String password;/** 帐号状态(0正常 1停用) */@ApiModelProperty("帐号状态(0正常 1停用)")private String status;/** 删除标志(0代表存在 2代表删除) */@ApiModelProperty("删除标志(0代表存在 2代表删除)")private String delFlag;/** 最后登录IP */@ApiModelProperty("最后登录IP")private String loginIp;/** 最后登录时间 */@ApiModelProperty("最后登录时间")private Date loginDate;}
说完了常用的属性,我们再来补充一下剩下的一些不常用属性:
属性 | 数据类型 | 默认值 | 概述 | 示例 | 说明 |
---|---|---|---|---|---|
name | String | “” | 字段的名称 | @ApiModelProperty(name = “userId”) | 允许覆盖属性的名称 |
defaultValue | String | “” | 字段的默认值 | @ApiModelProperty(defaultValue = “1”) | 描述属性的默认值,当属性需要设置默认值时,可设置此属性 |
access | String | “” | 允许API文档过滤参数,更多细节请查看 SwaggerSpecFilter 类 | ||
notes | String | “” | 暂时没用 | @ApiModelProperty(notes= “暂时没用”) | 注解的扩展属性,当前未使用。 |
dataType | String | “” | 描述字段的数据类型 | @ApiModelProperty(dataType=“int”) | 这个属性描述字段的数据类型,其值可以是对象或者是基本数据类型,而且会覆盖从类属性中读取的数据类型。 |
required | boolean | false | 是否必填 | @ApiModelProperty(required=true) | 指定字段为必要的还是非必要的 |
position | int | 0 | 指定字段在swagger文档中的显示顺序 | @ApiModelProperty(position= 1) | 允许排序类的字段 |
hidden | boolean | false | 隐藏类的字段 | @ApiModelProperty(hidden = true) | 允许类的字段在swagger模型定义中隐藏 |
example | String | “” | 字段的示例值 | @ApiModelProperty(example= “1”) | 该字段的一个示例值 |
accessMode | AccessMode | default AccessMode.AUTO | 字段的访问模式 | @ApiModelProperty(accessMode=READ_ONLY) | 允许指定字段的访问模式 (AccessMode.READ_ONLY, READ_WRITE) |
reference | String | “” | 字段的类型引用 | 指定对应类型定义的引用,并覆盖所指定的任何其他的元数据 | |
allowEmptyValue | boolean | false | 是否允许传递的字段为空值 | @ApiModelProperty(allowEmptyValue=true) | 允许传递空值 |
extensions | Extension[] | @Extension(properties = @ExtensionProperty(name = “”, value = “”)) | 该注解的扩展属性数组,可用于第三方 | @ApiModelProperty(@Extension(properties = @ExtensionProperty(name = “size”, value = “1”)) | 返回可选的扩展属性数组 |
相关文章:
常用Swagger注解汇总
常用Swagger注解汇总 前言 在实际编写后端代码的过程中,我们可能经常使用到 swagger 注解,但是会用不代表了解,你知道每个注解都有什么属性吗?你都用过这些属性吗?了解它们的作用吗?本文在此带大家总结一下…...
关于 TypeScript 声明文件
declare var 声明全局变量declare function 声明全局方法declare class 声明全局类declare enum 声明全局枚举类型declare namespace 声明(含有子属性的)全局对象interface 和 type 声明全局类型export 导出变量export namespace 导出(含有子…...
SpringBoot学习-原理篇
SpringBoot原理篇springboot技术本身就是为了加速spring程序的开发的,可以大胆的说,springboot技术没有自己的原理层面的设计,仅仅是实现方案进行了改进。将springboot定位成工具,你就不会去想方设法的学习其原理了。就像是将木头…...
目标检测YOLOv5数据集怎么找?
完整的配置-标注-训练-识别在我这篇博客小白YOLOv5全流程-训练实现数字识别_yolov5数字识别_牛大了2022的博客-CSDN博客 模型部分剖析可以看我每周深度学习笔记部分。关于训练的数据集怎么搞很多人问过我,我在这篇文章给大家一点我的经验和建议。 数据集是什么 简…...
安卓短信自动填充踩坑
安卓短信自动填充踩坑 前言 最近弄了个短信自动填充功能,一开始觉得很简单,不就是动态注册个广播接收器去监听短信消息不就可以了吗?结果没这么简单,问题就出在机型的适配上。小米的短信权限、荣耀的短信监听都是坑,…...
【抽象类和接口的区别】
抽象类和接口都是Java中实现多态的机制,它们都是用来约束子类必须要实现的方法。但是它们有以下区别: 实现方式 实现方式:抽象类是一个类,而接口是一个接口。一个类只能继承一个抽象类,但可以实现多个接口。 构造方…...
接口导出文件功能
1.写接口 export function getExport(params) { return fetch({ url: ******.export, method: post, data: params, responseType:blob, }) } 2.编写前端页面 <el-button :loading"exportDisable" :disabled&quo…...
深圳大学计软《面向对象的程序设计》实验9 期中复习
A. 机器人变身(类与对象)【期中模拟】 题目描述 编写一个机器人类,包含属性有机器名、血量、伤害值、防御值、类型和等级。其中血量、伤害和防御和等级、类型相关: 普通型机器人,类型为N,血量、伤害、防…...
python之异步编程
一、异步编程概述 异步编程是一种并发编程的模式,其关注点是通过调度不同任务之间的执行和等待时间,通过减少处理器的闲置时间来达到减少整个程序的执行时间;异步编程跟同步编程模型最大的不同就是其任务的切换,当遇到一个需要等…...
为什么很多计算机专业大学生毕业后还会参加培训?
基于IT互联网行业越来越卷的现状,就算是科班出身,很多也是达不到用人单位的要求。面对这样的现实情况,有的同学会选择继续深造,比如考个研,去年考研人数457万人次,可见越来越的同学是倾向考研提升学历来达到…...
JUC并发编程之JMM_synchronized_volatile
目录 JUC并发编程之JMM_synchronized_volatile 什么是JMM模型? JMM和JVM的区别 JMM不同于JVM内存区域模型 主内存 工作内存 Java内存模型与硬件内存架构的关系 JMM存在的必要性 数据同步八大原子操作 同步规则分析 并发编程的可见性,原子性与有序…...
hashCode 和 equals 的处理
文章目录hashCode 和 equals 的处理1. 阿里巴巴编程规范要求2. equals和hashcode的分析2.1 Object方法2.2 只覆写(Override)equals带来的问题问题演示问题分析问题处理hashCode 和 equals 的处理 1. 阿里巴巴编程规范要求 2. equals和hashcode的分析 2…...
17. OPenGL实现旋转移动物体
1. 说明: 整体思路:如果想实现动态,可以使用一个矩阵和我们给定的坐标值进行相乘,实时的改变坐标值 类似于坐标的齐次变换,然后使用一个定时器,在规定时间内触发重新绘制的函数。 实际效果: OP…...
《SQL基础》14. 存储过程 · 存储函数
存储过程 存储函数存储过程基本语法变量系统变量用户定义变量局部变量if判断参数case判断while循环repeat循环loop循环游标条件处理程序存储函数存储过程 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的工作,减…...
NFT Insider #87:The Sandbox 收购游戏开发工作室 Sviper,GHST 大迁徙即将拉开帷幕
引言:NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto(https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…...
html部分codewhy网课学习笔记
day1 网页显示的过程和服务器 浏览器内核,也称为渲染引擎 head标签描述网页的原数据,如title shifttab是向前缩进 div>ul>li可以快速生成 <div> <ul> <li></li> </ul> </div> 在早期,单标签如<input>也可写为&l…...
电脑出问题了怎么重装系统修好
电脑在使用过程中经常会出现各种各样的问题,如系统崩溃、蓝屏、病毒感染等。这些问题如果不能及时得到解决,将会给用户带来很多麻烦和损失。小白一键重装系统是一个功能强大的工具,可以帮助用户快速解决电脑常见问题。下面我们就来详细介绍如…...
Nginx国密支持问题记录
文章目录添加国密支持可能出现的问题国密不生效,查看 Nginx 可执行文件路径是否正确证书无法解析Nginx无法启动添加国密支持 NGINX添加国密支持 添加国密支持可以直接按照官网的操作顺序操作即可 参考网址:https://www.gmssl.cn/gmssl/index.jsp 可能出…...
基于ensp的小型局域网网络搭建及需求分析
一 需求分析本实验的目的在于建立小型局域网。由于公司由财政部、人事部、科技部三个部门组成,分布在同一个交换机下。设计以下网络:三个个部门使用两台交换机连接,然后连接到汇聚交换机,再通过路由器与外网以及其他部门网络相连。…...
Kubernetes学习(二)Pod
创建Pod kubectl创建nginx pod 编写 nginx pod的yaml文件 apiVersion: v1 kind: Pod metadata:name: my-nginxlabels:name: my-nginx spec:containers:- image: nginxname: my-nginxresources:limits:memory: "128Mi"cpu: "500m"ports:- name: nginx-po…...
【Docker】docker | 迁移docker目录
一、场景说明1、物理机磁盘空间不够用了2、docker的镜像、容器、卷等资料的默认路径为: /var/lib/docker3、增加了数据盘挂在,需要将docker的全部资料更换个目录二、操作确认是否满足切换条件1)服务是否能够暂停,如果可以就OK2&am…...
day24_多线程进阶
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、生产者消费者 六、线程池 零、 复习昨日 创建线程的几种方式 1) 继承 2) 实现Runnable 3) calla…...
Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实
⭐️我叫恒心,一名喜欢书写博客的研究生在读生。 原创不易~转载麻烦注明出处,并告知作者,谢谢!!! 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。 功能点一:文件查找与…...
有关数据库的一级、二级、三级封锁协议
一级封锁协议 一级封锁协议是指,事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK).一级封锁协议可防止丢失修改,并保证事务T是可恢复的。在…...
【Android Studio】【学习笔记】【2023春】
文章目录零、常用一、界面布局疑问&报错零、常用 一、界面布局 Android——六大基本布局总结/CSDN小马 同学 【Android】线性布局(LinearLayout)最全解析/CSDNTeacher.Hu 一个不错的计算器界面👇 Android Studio App LinearLayout多层…...
window.open()下载文件重命名/js下载文件重命名/js跨域下载文件重命名
普通文件下载 // 1 var fileUrl https://xxxx.docx; window.open(fileUrl"?attname文档.docx");// 2 var a document.createElement(a); a.href https://xxxx.docx; a.download 文档.docx; a.target "_blank"; a.click();以上方式 attname 和 a.down…...
zookeeper:简介及常用命令
目录 一、Zookeeper简介 二、Zookeeper服务端常用命令 1、启动ZooKeeper服务 2、查看ZooKeeper服务状态 3、停止ZooKeeper服务 4、重启ZooKeeper服务 三、Zookeeper客户端常用命令 1、连接ZooKeeper服务端 2、断开连接:quit 3、查看命令帮助:help…...
与流程挖掘布道者熵评科技孙一鸣博士共话流程挖掘市场的起源与前景 | 爱分析访谈
调研:李进宝 陈元新 撰写:李进宝 陈元新 随着数字化转型持续深入,国内企业流程挖掘需求初露端倪。流程挖掘是指通过采集和分析企业数据,以可视化流程图还原企业实际发生的业务流程,进而评估流程运行状况、诊断流程运…...
第十一届蓝桥杯省赛——2解密
题目:【问题描述】小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的字符 Tc。下表给出了字符变换的规则:字母cTc字母cTc字母cTc字母cTcaynlAYNLbxogBXOGcmpoCMPOddquDDQUearfEARFfcssFCSSgitzGITZhkupHKUPinvwINV…...
ChatGPT解答:PYQT5 美化各种控件的方案和实例
ChatGPT解答:PYQT5 美化各种控件的方案和实例 修改按钮样式 button QPushButton(按钮, self) button.setStyleSheet(QPushButton{background-color: red; border-radius: 5px;})修改标签样式 label QLabel(标签, self) label.setStyleSheet(QLabel{color: blue; …...
wordpress3.0 主题/seo的重要性
最近做前后端项目,前端项目启动需要切换到指定目录下,然后执行:npm run dev,进行启动。但是每次重启Idea之后打开Terminal都是项目的根目录,需要切换一下,比较麻烦,百度了一下,没找到…...
wordpress二级开发/东莞关键词排名提升
这题弄了两天才做出来,还是去请教了竹教主。 贴个别人的解说吧,自己懒得写了 把斐波那契数列转化为矩阵:A{1,1} {1,0}; {f[n1],f[n]} {f[n],f[n-1]} A^n ;最后输出右上角那项或者用{f[n2],f[n1]}{f[n1], f[n] } A^(n1); 最后输出右下角那项 我们用第…...
外部网站可以做链接到淘宝吗/磁力狗bt
想要寻找一款各功能强大,使用简便的看图工具?一定不要错过这篇文章,小编精选了5款综合性非常高的软件分给大家,颜值和功能性都经得住吊打的那种,话不多说来看文字介绍吧~ macOS上简便好用的看图软件分享 XnViewMP fo…...
我想花钱做网站/企业网站开发费用
巧妙转换Excel文件(转)广大中小学教师已经习惯了利用Excel来进行数据的输入和处理,但是我们经常碰到这种情况,上级主管部门为了进行统考,往往会用VF编写一套软件,要求下属学校统一上报成绩的格式,上报的文件需是DBF格式…...
安徽地方政府网站建设情况/漳州seo建站
大数据是一项涉及不同业务和技术领域的技术和工具的集合,海量离线数据分析可以应用于多种商业系统环境,例如,电商海量日志分析、用户行为画像分析、科研行业的海量离线计算分析任务等场景。离线大数据分析概述主流的三大分布式计算框架系统分…...
网站开发技术发展历程/搜索引擎成功案例分析
一般指示灯正常发光的电流在10~20mA,低电流LED灯的工作电流在2mA一下,亮度和普通的一样。 压降 电流 红色 1.82~1.88V 5~8mA 绿色 1.75~1.82V 3~5mA 橙色 1.7~1.8V …...