[Swagger] @ApiResponse response = Response.Class 설정해도 응답 Class 적용 안되는 에러 해결

GilLog·2021년 7월 1일
0

에러

목록 보기
12/17

🙆‍♂️ import 🙇‍♂️

bleepcoder[Springfox: @ApiResponse response parameter not used in 3.0.0]

문제 상황

Swagger를 사용해서 API 문서 생성 중,

@ApiResponse Annotation으로 응답 Code 별 Response를 따로 DTO Class로 관리하고 싶던 와중,

아래와 같이 작성해도 응답 결과가 빈값으로 출력되고 있었다.


    @PostMapping("")
    @ApiOperation(
        value = "신규 자격증 생성"
        , notes = "신규 자격증을 생성한다."
        , produces = "application/json"
        , response = ResponseDTO.class
    )
    @ApiImplicitParams({
        @ApiImplicitParam(
            name = "requestDTO"
            , value = "생성을 위해 필요한 Requeest Body"
        )
    })
    @ApiResponses({
        @ApiResponse(
            code = 200
            , message = "생성 성공"
        )
        , @ApiResponse(
            code = 201
            , message = "생성된 자원 정보"
            , response = ResponseDTO.class
            , responseContainer = "List"
        )
        , @ApiResponse(
            code = 409
            , message = "로직 수행 불가 모순 발생"
            , response = ErrorDTO.class
            , responseContainer = "List"
        )
    })
    @ResponseBody
    public ResponseDTO postLicenses(@RequestBody RequestDTO requestDTO) {
        return new ResponseDTO();
    }
@Getter
@Setter
@ToString
@NoArgsConstructor
@ApiModel(description = "에러 상태")
public class ErrorDTO {
    
    @ApiModelProperty(example = "1")
    private String code;
    @ApiModelProperty(example = "올바르지 않은 회원 ID")
    private String message;
}


@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ResponseDTO {
    
    @ApiModelProperty(example = "111")
    private long seq;

    @ApiModelProperty(example = "길로그")
    private String name;
    
    @ApiModelProperty(example = "gillog")
    private String id;

    @ApiModelProperty(example = "2021-07-02")
    private Date created;

    @ApiModelProperty(example = "[{'rel' : 'self', 'href' : 'https://api.ddaja.com/licenses/111', 'method' : 'GET'}]")
    private List<String> links;
}

해결 과정

나는 Swagger, @ApiResponse, NotWorking 등으로 Google 신의 도움을 구했고,

해당 이슈가 Swagger 3.0.0대 Model과 관련있다는 걸 발견했다.

Spring fox 3.0은 v3 Model을 사용하는데,

source.getResponses() 함수의 Type MissMatch 관련 이슈 였다.

해결 방법

해결 방법으로는 크게 두 가지가 있는데,

Swagger v3 model 설정을 끄는 방법과,

Docket 객체DocumentationType을 2버전 대로 내리는 방법이 있다.

spring boot 설정에서 swagger의 use-model-v3false로 지정

첫 번째 방법은 spring boot 설정(application.properties)에서 swagger의 use-model-v3false로 지정하는 방법이다.

springfox.documentation.swagger.use-model-v3=false

하지만 나는 위 방법으로 해결하지 못했다.

DocumentationType.OAS_30 > DocumentationType.SWAGGER_2

두 번째 방법은 SwaggerConfig에서 Docket 객체 생성 Prameter의 DocumentationTypeSWAGGER_2로 지정하는 방법이다.

new Docket(DocumentationType.SWAGGER_2)

위와 같이 변경하여 결국 해결할 수 있었다.


오늘도 해결 완료 🙆🏻‍♂️

profile
🚀 기록보단 길록을 20.10 ~ 22.02 ⭐ Move To : https://gil-log.github.io/

0개의 댓글