환경 :
인텔리제이
jdk1.8
SpringBoot 2.6.1
gradle
Swagger 3.0.0
SwaggerUI 3.0.0
swagger를 적용하는 방법은 구글 검색하면 다른 분들이 잘 써놔서 검색하면 잘 나올것이다
그런데 나는 SpringBoot 2.6.1 환경에서 적용하려고 해서 그런지 충돌이 나는 것 같아
해결한 부분을 설명 드리려 한다.
swagger를 적용한 프로젝트를 실행하면 다음과 같이 에러가 난다.
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.13.jar:5.3.13]
at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_311]
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.13.jar:5.3.13]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.1.jar:2.6.1]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-2.6.1.jar:2.6.1]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) ~[spring-boot-2.6.1.jar:2.6.1]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.1.jar:2.6.1]
at com.ej.batchtest.BatchTestApplication.main(BatchTestApplication.java:18) [main/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_311]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_311]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_311]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_311]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.6.1.jar:2.6.1]
Caused by: java.lang.NullPointerException: null
at springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]
at springfox.documentation.RequestHandler.sortedPaths(RequestHandler.java:113) ~[springfox-core-3.0.0.jar:3.0.0]
at springfox.documentation.spi.service.contexts.Orderings.lambda$byPatternsCondition$3(Orderings.java:89) ~[springfox-spi-3.0.0.jar:3.0.0]
생략..
스택오버플로우에 많은 사람들이 이런 저런 논쟁을 하였으나
결론은 이렇게 하면 된다
1. 스웨거 설정한 class에 WebMvcConfiguationSupport 를 확장시킨다.
2. 새로운 경로를 잡아준다
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
}
참고로 2번 내용은 구글 검색으로도 안나와서 swagger-ui3.0의 jar파일 내부 구조를 보고 설정했다.
이제 서버 올려서 서버홈경로/swagger-ui/index.html 으로 접속하면 잘 될것이다.
'프로그래밍 노트 > Spring, Java, Kotlin' 카테고리의 다른 글
thymeleaf 와 tailwind 로 자바 서블릿 프로젝트 구성하기 (0) | 2023.11.15 |
---|---|
Springboot에서 messages.properties로 다국어 사용하는 방법 (reload까지) (2) | 2022.08.17 |
JAVA로 API 개발할 때 DTO파일 읽어서 필요하거나 필요 없는 필드 확인하기 (0) | 2021.08.03 |
java AES 인코딩, 디코딩 예제 (0) | 2020.11.06 |
Java 파일 복사 프로세스 (eml파일 헤더 변조하여 복사) (0) | 2020.11.03 |