【Java】@ApiOperation vs @ApiResponse in Swagger

简介: 【Java】@ApiOperation vs @ApiResponse in Swagger

原文

www.baeldung.com/swagger-api…

引言

本文内容讨论的是 @ApiOperation@ApiResponse 注解的优劣。

介绍Swagger

一个RestFul最重要的是具备“自描述能力”,所谓的自描述能力是能在返回结果的同时,告知客户端调用下 一步的行为,Swagger在一定程度上封装和规范了这些操作。

什么是Swagger?

Swagger represents a set of open-source tools built around OpenAPI Specification. It can help us design, build, document, and consume REST APIs.

Swagger代表了一套围绕OpenAPI规范建立的开源工具。它可以帮助我们设计、构建、记录REST APIs接口。其中最为常用的注解便是 @ApiOperation 和 @ApiResponse。


@RestController
@RequestMapping("/customers")
class CustomerController {
   private final CustomerService customerService;
   public CustomerController(CustomerService customerService) {
       this.customerService = customerService;
   }
   @GetMapping("/{id}")
   public ResponseEntity<CustomerResponse> getCustomer(@PathVariable("id") Long id) {
       return ResponseEntity.ok(customerService.getById(id));
   }
}

下面分别介绍这两个注解的使用,最后是进行对比。

@ApiOperation

关键点:描述单独的一个操作和行为。通常用于单一的路径或者http请求方法。


@ApiOperation(value = "Gets customer by ID", 
        response = CustomerResponse.class, 
        notes = "Customer must exist")
@GetMapping("/{id}")
public ResponseEntity<CustomerResponse> getCustomer(@PathVariable("id") Long id) {
    return ResponseEntity.ok(customerService.getById(id));
}

下面介绍@ApiOperation的一些属性:

value

value属性主要是描述接口的行为,注意参数大小不能超过120个字符。从长度限制来看要尽可能的简化注解的描述。


@ApiOperation(value = "Gets customer by ID")

notes

个人认为把这个注解当成comment更为合适,notes和value的区别是可以填写的长度限制为text,意思是更为详细的叙述接口功能。


@ApiOperation(value = "Gets customer by ID", notes = "Customer must exist")

response

@ApiOperation注解中定义的响应属性应该包含一般的响应类型。大部分情况下我们会把返回结果用统一的对象包装:


class CustomerResponse {
   private Long id;
   private String firstName;
   private String lastName;
   // getters and setters
}

更为常见的是使用类似AjaxDto这样的对象封装响应Code,响应Msg和响应数据Data。

在使用的过程中设置Class类,在Swagger文档中将会对应生成相关的对象以及


@ApiOperation(value = "Gets customer by ID",
        response = CustomerResponse.class,
        notes = "Customer must exist")
@GetMapping("/{id}")
public ResponseEntity<CustomerResponse> getCustomer(@PathVariable("id") Long id) {
    return ResponseEntity.ok(customerService.getById(id));
}

code

也就是响应code码,对应 Http Status

@ApiResponse

@ApiResponse 注解主要用于描述接口的返回状态码以及对应的返回信息。虽然@ApiOperation注解描述了操作和一般的返回类型,但@ApiResponse注解描述了其余可能的状态码。

@ApiResponse注解的特点是方法注解优先于类注解。我们应该在@ApiResponses注解中使用@ApiResponse注解,无论我们有一个还是多个响应。

下面是正确的@ApiResponse 用法案例:


@ApiResponses(value = {  
        @ApiResponse(code = 400, message = "Invalid ID supplied"),  
        @ApiResponse(code = 404, message = "Customer not found")})  
@GetMapping("/{id}")  
public ResponseEntity<CustomerResponse> getCustomer(@PathVariable("id") Long id) {  
    return ResponseEntity.ok(customerService.getById(id));  
}

对于特殊的状态码进行描述:


@ApiOperation(value = "Gets customer by ID", notes = "Customer must exist")  
@ApiResponses(value = {  
        @ApiResponse(code = 200, message = "OK", response = CustomerResponse.class),  
        @ApiResponse(code = 400, message = "Invalid ID supplied"),  
        @ApiResponse(code = 404, message = "Customer not found"),  
        @ApiResponse(code = 500, message = "Internal server error", response = ErrorResponse.class)})  
@GetMapping("/{id}")  
public ResponseEntity<CustomerResponse> getCustomer(@PathVariable("id") Long id) {  
    return ResponseEntity.ok(customerService.getById(id));  
}

code 和 message

与@ApiOperation注解中的code属性一样,它应该包含响应的HTTP状态代码。值得一提的是,我们不能用相同的代码属性定义一个以上的@ApiResponse。


@ApiResponse(code = 400, message = "Invalid ID supplied")

response

response可以为特殊的状态码指定对象:


class ErrorResponse {
    private String error;
    private String message;
    // getters and setters
}

其次,让我们为内部服务器错误添加一个新的@ApiResponse。


@ApiResponses(value = {
        @ApiResponse(code = 400, message = "Invalid ID supplied"),
        @ApiResponse(code = 404, message = "Customer not found"),
        @ApiResponse(code = 500, message = "Internal server error", response = ErrorResponse.class)})
@GetMapping("/{id}")
public ResponseEntity<CustomerResponse> getCustomer(@PathVariable("id") Long id) {
    return ResponseEntity.ok(customerService.getById(id));
}

@ApiOperation 和 @ApiResponse 区别

@ApiOperation @ApiResponse
通用用于描述一个操作 用于描述操作的可能的响应
通常用于成功的请求 可以用于成功或者失败的各种请求
只能用在方法级别 可以用于类或者方法级别
可以直接使用 只能在@ApiResponses注解中使用。
默认code为200 没有默认值


相关文章
|
3月前
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
118 2
|
3月前
|
数据采集 缓存 Java
Python vs Java:爬虫任务中的效率比较
Python vs Java:爬虫任务中的效率比较
|
10天前
|
存储 缓存 Oracle
Java线程池,白话文vs八股文,原来是这么回事!
本文介绍了Java线程池的原理、实现方式及相关参数。首先,通过类比公司员工的方式解释了线程池的核心概念,如核心线程、最大线程数、任务队列和拒绝策略。接着,详细描述了线程池的任务处理流程,并提供了使用`ThreadPoolExecutor`和`Executors`创建线程池的代码示例,强调了`ThreadPoolExecutor`的灵活性和`Executors`的局限性。最后,总结了线程池的相关参数及不同类型的线程池实现,并附带常见面试题及其解答,帮助读者全面理解线程池的应用场景和优化方法。
29 4
|
2月前
|
消息中间件 前端开发 Java
【国产化软件】接口开放平台:Java+Swagger+Vue3,适配移动端
本文档介绍了基于Java的开放平台技术栈及使用流程,涵盖从注册开发者账号、创建应用、申请令牌到调用API接口的全过程。平台提供丰富的接口管理和统计功能,支持开发者在线维护个人资料和接口令牌,同时兼容移动设备访问和黑夜模式。技术栈方面,后端采用Spring Boot 3 + MySQL + Redis + RabbitMQ + Nacos,前端则基于Vue3 + TypeScript 5.x + Element Plus + UnoCSS。访问开放平台的地址为:http://java.test.yesapi.cn/platform/。
|
3月前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
105 3
|
7月前
|
Java C++ 开发者
【技术贴】if-else VS switch:谁才是Java条件判断的王者?
【6月更文挑战第14天】本文探讨了Java中if-else与switch语句的选择问题。if-else基于布尔逻辑,适合处理复杂逻辑,而switch在处理多分支特别是枚举类型时更高效。if-else在条件动态变化或复杂逻辑时更合适,switch则因其跳转表机制在固定选项中表现优秀。性能上,switch在大量选项时占优,但现代JVM优化后两者差异不大。选择时应考虑场景、可读性和维护性,灵活运用。理解两者特点,才能写出优雅高效的代码。
449 0
|
3月前
|
前端开发 Java API
Swagger接口文档 —— 手把手教学,全方位超详细小白能看懂,百分百能用Java版
本文提供了一份详细的Swagger接口文档生成工具的使用教程,包括了导入依赖、配置类设置、资源映射、拦截器配置、Swagger注解使用、生成接口文档、在线调试页面访问以及如何设置全局参数(如token),旨在帮助Java开发者快速上手Swagger。
806 0
Swagger接口文档 —— 手把手教学,全方位超详细小白能看懂,百分百能用Java版
|
5月前
|
Java C++ 开发者
if-else VS switch:谁才是Java条件判断的王者?
if-else VS switch:谁才是Java条件判断的王者?
54 3
|
5月前
|
传感器 C# 监控
硬件交互新体验:WPF与传感器的完美结合——从初始化串行端口到读取温度数据,一步步教你打造实时监控的智能应用
【8月更文挑战第31天】本文通过详细教程,指导Windows Presentation Foundation (WPF) 开发者如何读取并处理温度传感器数据,增强应用程序的功能性和用户体验。首先,通过`.NET Framework`的`Serial Port`类实现与传感器的串行通信;接着,创建WPF界面显示实时数据;最后,提供示例代码说明如何初始化串行端口及读取数据。无论哪种传感器,只要支持串行通信,均可采用类似方法集成到WPF应用中。适合希望掌握硬件交互技术的WPF开发者参考。
92 0
|
5月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
362 0