spring boot接口參數校驗:get與post請求差異及統一處理方案
本文探討spring boot中GET和POST請求參數校驗的差異,并提供一種統一處理校驗結果的方案。
問題描述:
在Spring Boot v2.7.14-snapshot版本中,使用spring-boot-starter-validation依賴。POST請求使用@RequestBody @Valid進行參數校驗,能有效捕獲MethodArgumentNotValidException并返回類似“校驗失敗: parentId:不能為NULL”的錯誤信息。然而,GET請求使用@RequestParam long feedId,即使添加@Validated注解和@NotNull注解,也無法正常校驗,而是拋出MissingServletRequestParameterException異常,提示“required request parameter ‘feedId’ for method parameter type long is not present”。 目標是使GET請求的校驗結果與POST請求一致,返回類似“校驗失敗: feedId:不能為null”的錯誤信息。
解決方案:
為了統一GET和POST請求的參數校驗及錯誤處理,建議采用以下方法:
public class ApiGetRequest { @NotNull private Long feedId; // getters and setters }
修改GET請求的Controller方法:
@GetMapping("/api") public String apiGet(@Valid ApiGetRequest request) { // ... }
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MissingServletRequestParameterException.class) @ResponseBody public String handleMissingParams(MissingServletRequestParameterException ex) { String paramName = ex.getParameterName(); return String.format("校驗失敗: %s:不能為null", paramName); } // 可以在此處添加其他異常處理方法,例如MethodArgumentNotValidException的處理 }
通過以上步驟,GET請求的參數校驗將與POST請求保持一致,并返回統一格式的錯誤信息。@Valid注解結合DTO對象確保了GET請求參數的有效校驗,而自定義的全局異常處理器則負責統一異常處理和錯誤信息格式化。
通過這種方式,可以有效解決Spring Boot中GET和POST請求參數校驗不一致的問題,并提供更一致、更友好的用戶體驗。