swagger api에서 기본 오류 컨트롤러를 사용하지 않음
스프링 부트 프로젝트에서 swagger2를 사용하고 있습니다.잘 되고 있어요. 하지만 저는 이 프로그램을 제외해야 합니다.basic-error-controller
api에서.저는 현재 regex를 사용하여 아래 코드를 사용하고 있습니다.잘 되고 있는데 이걸 할 수 있는 완벽한 방법이 있을까요?
코드:
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex('(?!/error.*).*'))
.build()
}
구글에서 검색한 후 GitHub의 한 문제에서 해결책을 얻었습니다.[질문] 기본 오류 컨트롤러가 스웨거 설명에 추가되지 않도록 하려면 어떻게 해야 합니까?를 사용하여 실행할 수 있습니다.
사용 후 코드는 다음과 같습니다.
@Bean
public Docket demoApi() {
return new Docket(DocumentationType.SWAGGER_2)//<3>
.select()//<4>
.apis(RequestHandlerSelectors.any())//<5>
.paths(Predicates.not(PathSelectors.regex("/error.*")))//<6>, regex must be in double quotes.
.build()
}
시간이 많이 지났지만, 같은 문제가 있는 사람이 있으면 Rest Controller에 셀렉터를 제공하여 실행할 수 있습니다.
new Docket(SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.paths(PathSelectors.any())
.build();
컨트롤러에 @RestController 주석이 붙어 있음에 유의하십시오.
저도 같은 문제에 부딪혔어요.나는 이 일을 했다.
java
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.xxx.xxx"))
.paths(PathSelectors.any())
.build();
}
스웨거 설명서에 표시되는 엔드포인트를 제한하는 가장 좋은 방법은 다음과 같습니다.
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(paths())
.build().apiInfo(metadata());
}
private Predicate<String> paths() {
return or(
regex("/firstContext.*"),
regex("/secondContext.*"));
}
private ApiInfo metadata() {
return new ApiInfoBuilder()
.title("SomeTitle")
.description("SomeDescription")
.build();
}
따라서 paths() 메서드콘텍스트로 시작하지 않는 각 엔드포인트는 swagger에 의해 렌더링되지 않습니다.
커스텀을 사용하는 경우ErrorController
거기에 주석을 달기만 하면 된다
@ApiIgnore
또는
@Api(hidden = true)
예를 들어 다음과 같습니다.
@Controller
@ApiIgnore
class MyErrorController : ErrorController {
@RequestMapping("/error")
fun handleError(request: HttpServletRequest): String {
val status: String? = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE)?.toString()
val statusCode: Int? = status?.toInt()
return when (statusCode) {
HttpStatus.NOT_FOUND.value() -> return "error-404"
HttpStatus.INTERNAL_SERVER_ERROR.value() -> return "error-500"
else -> "error"
}
}
override fun getErrorPath(): String {
return "/error"
}
}
내 경우 메서드를 @Bean으로 만들면 basic-error-controller가 표시되지 않습니다.
@Bean을 삭제하면 swagger-ui에 basic-error-controller가 표시됩니다.
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors.basePackage(CONTROLLER_PATH))
.paths(regex("/.*")).build();}
모든 API 엔드포인트와 일치하는 regex를 작성해야 한다고 생각합니다.마이크로 서비스를 실행하고 있다면 아마 한 단어만 일치할 것입니다.그렇지 않으면 질문에 넣는 것이 더 의미가 있을 것입니다.
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.regex("/accounts.*"))
.build();
}
언급URL : https://stackoverflow.com/questions/33431343/avoiding-default-basic-error-controller-from-swagger-api
'programing' 카테고리의 다른 글
워드프레스 메뉴에 범위 추가 (0) | 2023.03.17 |
---|---|
Composer에서 프리미엄 Wordpress 테마 설치 (0) | 2023.03.17 |
Angular 유닛 테스트에 서비스를 주입할 때 알 수 없는 공급자가 발생하는 오류 (0) | 2023.03.17 |
Jackson Json: 어레이를 Json Node 및 Object Node로 변환하는 방법 (0) | 2023.03.17 |
반응 개발 도구가 Chrome 브라우저에서 로드되지 않음 (0) | 2023.03.17 |