Springbootにおけるrestインタフェース404などのエラーは、統一されたjsonフォーマットを返し、NoHandlerFoundExceptionを放出した後の静的リソースの処理を返す
5045 ワード
一般的にrestfulインタフェースを使用すると、jsonデータを統一的に返します.戻り値フォーマットは次のようになります.
idDoneはリクエストのアドレスまたはタイプが正しくないことを示し、このとき404異常の処理を要求するがspringbootでは404異常はデフォルトリソースマッピングが行われており、特殊な構成をしていないと、我々の異常処理システムは404リクエスト(文末のため)を処理できず、戻り値のフォーマットを統一することができず、友好的に提示できない.404異常をキャプチャして、統一した戻り値を行う処理も簡単である.最初にspringbootの例外自動リソースマッピングを閉じて、例外を放出します.
次に@ControllerAdvice異常処理クラスで404異常と判断し、友好的な戻り値を提供すればよい.
もう1つの注意点は、戻り値のデフォルトはJacksonでシーケンス化されていますが、シーケンス化isの先頭のパラメータは、先頭のisを自動的に削除するので、戻り値のプロパティisDoneでシーケンス化名を定義し、シーケンス化エラーが発生しないことを保証する必要があります.
!!!@JsonProperty("idDone")注記getメソッドに追加するには、フィールドにシーケンス化すると変な結果になりますが、どんな結果になるか試してみればわかります.
このように操作すると、NoHandlerFoundExceptionは確かに異常を投げ出すことができますが、上記の構成では静的リソースマッピングがオフになっているため、プロジェクトの静的リソースにアクセスできません.swaggerを統合すると、/swagger-uiが発見されるなど、静的リソースのマッピングを手動で定義する必要があります.htmlページにアクセスできません.静的リソースマッピングを手動で定義する必要があります.
これにより、NoHandlerFoundException異常を投げ出しながら静的ページにアクセスできます.
springbootの静的リソースマッピングでは、デフォルト構成の/**が/static(/public、/resources、/META-INF/resources)にマッピングされ、デフォルト構成の/webjars/**がclasspath:/META-INF/resources/webjars/にマッピングされます.一方、NoHandlerFoundExceptionの条件を投げ出すと、DispatcherServiceletのソースコードから次のことがわかります.
パスが一致しない場合はNoHandlerFoundException例外が放出されますが、デフォルトの一致パスには/**があるため、アドレスが間違っていても/**という静的リソースマッピングアドレスに一致し、noHandlerFoundメソッドには入らず、NoHandlerFoundExceptionは放出されません.
{
"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は放出されません.