기술 스택
OpenJDK 17.0.5
Spring Boot 2.7.7
SpringFox 3.0.0
발단
스테이징 서버에서 Swagger의 Server URL을 등록해주다가 발견한 문제.
@Configuration
public class SwaggerConfiguration {
@Bean
public Docket swagger() {
return new Docket(DocumentationType.OAS_30)
.servers(new Server("", "https://xxx.com", "", new ArrayList<>(), new ArrayList<>()))
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
}
Docket으로 서버의 URL을 넣어줬는데 적용이 안됐다.
동일하게 Docket.host() 메소드를 사용했을 때도 적용이 안됐다.
해결과정
열심히 구글링을 해서 나와 같은 에러를 찾았다.
https://github.com/springfox/springfox/issues/3950
스웨거 타입이 OpenAPI 3.0 일 때 Docket.host() 가 안먹는다는 내용이다.
그런데 이슈가 활성화되지 않아 클로즈되어있어 다시 구글링 해서 아래의 동일한 이슈를 찾았다.
https://github.com/springfox/springfox/issues/3483
다행히 동일한 이슈가 열려 있었다.
3.0.1에서 해결해 주신다고 하셨지만, 3.0.0
Release가 Jul 14, 2020, 3.0.1 마일스톤즈가 49% complete인 것으로 보아, 당분간 해결될 일이 없을 것 같다.
친절하게 알려주신 #3445 이슈로 이동해봤다.
https://github.com/springfox/springfox/issues/3445
WebMvcOpenApiTransformationFilter
를 구현해 서버 URL을 설정해줄 수 있었다.
결론
@Component
public class SpringfoxSwaggerBasePathResolver implements WebMvcOpenApiTransformationFilter {
@Value("${spring.swagger.server.url}")
private String url;
@Override
public OpenAPI transform(OpenApiTransformationContext<HttpServletRequest> context) {
OpenAPI openApi = context.getSpecification();
Server localServer = new Server();
localServer.setUrl(url);
openApi.setServers(List.of(localServer));
return openApi;
}
@Override
public boolean supports(DocumentationType documentationType) {
return documentationType.equals(DocumentationType.OAS_30);
}
}
이렇게 필터를 통해 해결했다.
'Backend > Spring' 카테고리의 다른 글
@Transactional 전파 전략 (0) | 2023.05.07 |
---|---|
DI와 IoC (0) | 2023.04.07 |
Spring Container와 Bean의 Lifecycle (0) | 2023.04.07 |
Spring Boot Controller Test (0) | 2023.04.07 |
Spring Session With Redis 설정하기 (0) | 2023.03.09 |