Springbootにおけるrestインタフェース404などのエラーは、統一されたjsonフォーマットを返し、NoHandlerFoundExceptionを放出した後の静的リソースの処理を返す

5045 ワード

一般的にrestfulインタフェースを使用すると、jsonデータを統一的に返します.戻り値フォーマットは次のようになります.
{
    "status": {
        "code": 666,
        "msg": " "
    },
    "data": " ",
    "idDone": true
}

idDoneはリクエストのアドレスまたはタイプが正しくないことを示し、このとき404異常の処理を要求するがspringbootでは404異常はデフォルトリソースマッピングが行われており、特殊な構成をしていないと、我々の異常処理システムは404リクエスト(文末のため)を処理できず、戻り値のフォーマットを統一することができず、友好的に提示できない.404異常をキャプチャして、統一した戻り値を行う処理も簡単である.最初にspringbootの例外自動リソースマッピングを閉じて、例外を放出します.
# ,  
spring.mvc.throw-exception-if-no-handler-found=true
# 
spring.resources.add-mappings=false

次に@ControllerAdvice異常処理クラスで404異常と判断し、友好的な戻り値を提供すればよい.
@ExceptionHandler(Throwable.class)
    @ResponseBody
    public RespData handleExceptions(Throwable e) {
        RespData respData = new RespData<>();
        // 
        if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
            respData.isDone(false);
            return respData.status(RespCode.CODE_NOT_FOUND).data(" ");
        }

        // 
        .......
    }

もう1つの注意点は、戻り値のデフォルトはJacksonでシーケンス化されていますが、シーケンス化isの先頭のパラメータは、先頭のisを自動的に削除するので、戻り値のプロパティisDoneでシーケンス化名を定義し、シーケンス化エラーが発生しないことを保証する必要があります.
@JsonProperty("isDone")
    public boolean isDone() {
        return isDone;
    }

!!!@JsonProperty("idDone")注記getメソッドに追加するには、フィールドにシーケンス化すると変な結果になりますが、どんな結果になるか試してみればわかります.
このように操作すると、NoHandlerFoundExceptionは確かに異常を投げ出すことができますが、上記の構成では静的リソースマッピングがオフになっているため、プロジェクトの静的リソースにアクセスできません.swaggerを統合すると、/swagger-uiが発見されるなど、静的リソースのマッピングを手動で定義する必要があります.htmlページにアクセスできません.静的リソースマッピングを手動で定義する必要があります.
@Configuration
public class WebAppConfigurer extends WebMvcConfigurationSupport {

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/","/static", "/public");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");

        super.addResourceHandlers(registry);
    }
}

これにより、NoHandlerFoundException異常を投げ出しながら静的ページにアクセスできます.
springbootの静的リソースマッピングでは、デフォルト構成の/**が/static(/public、/resources、/META-INF/resources)にマッピングされ、デフォルト構成の/webjars/**がclasspath:/META-INF/resources/webjars/にマッピングされます.一方、NoHandlerFoundExceptionの条件を投げ出すと、DispatcherServiceletのソースコードから次のことがわかります.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
    noHandlerFound(processedRequest, response);
    return;
}

パスが一致しない場合はNoHandlerFoundException例外が放出されますが、デフォルトの一致パスには/**があるため、アドレスが間違っていても/**という静的リソースマッピングアドレスに一致し、noHandlerFoundメソッドには入らず、NoHandlerFoundExceptionは放出されません.