问题描述
我正在尝试为swagger文档定义全局响应。我有以下注释界面:
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.web.bind.annotation.ResponseBody;
import java.lang.annotation.*;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@ApiResponses(value = {
@ApiResponse(
code = 200,message = "Successful status response"
),@ApiResponse(
code = 401,message = "Unauthorized",response = Payload.Error.class
),@ApiResponse(
code = 403,message = "Forbidden",@ApiResponse(
code = 404,message = "Not Found",@ApiResponse(
code = 500,message = "General Server Error",})
@ResponseBody
public @interface PayloadResponse {
}
在我的控制器内部,我使用这样的界面:
@ApiOperation("Get user details after login")
@PayloadResponse
@GetMapping("/user")
Payload<User> fetchUser(
@ApiIgnore
@RequestHeader(HttpHeaders.AUTHORIZATION) String authorization
);
这里Payload.Error
是Payload<T>
的内部类。但是无论如何,我也尝试了其他一些类,例如:String,Map等,但是大张旗鼓的ui仍然显示空响应:
从现在开始,我如何设法使其尽可能少地改变?
解决方法
Springfox 3.0默认使用v3模型,但是您使用的是io.swagger.annotations.ApiResponses
而不是io.swagger.v3.oas.annotations.responses.ApiResponses
和io.swagger.annotations.ApiResponse
代替io.swagger.v3.oas.annotations.responses.ApiResponse
。
此问题已记录在
https://github.com/springfox/springfox/issues/3503
但是解决方法也非常容易。只需添加一个属性即可使用v2模型覆盖v3模型。
springfox.documentation.swagger.use-model-v3=false
它就像一种魅力。与@PayloadResponse
一起使用,并在端点处直接注释。