programing

swagger api에서 기본 오류 컨트롤러를 사용하지 않음

abcjava 2023. 3. 17. 19:30
반응형

swagger api에서 기본 오류 컨트롤러를 사용하지 않음

스프링 부트 프로젝트에서 swagger2를 사용하고 있습니다.잘 되고 있어요. 하지만 저는 이 프로그램을 제외해야 합니다.basic-error-controllerapi에서.저는 현재 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

반응형