這個有點特殊。 方法內的異常,手動打日誌很容易。
入參發生異常,接口肯定是返回信息的。 但是之後排查很有困難,因爲根本沒有記錄日誌。
解決方案
使用異常攔截器 @ExceptionHandler和@ControllerAdvice,這裏不敘述使用方法。
400異常模擬
@RequestParam(required = true)設置入參必填
@RequestParam(required = true) 設置入參username爲必填,爲空報錯:
@RequestMapping("/queryString")
@ResponseBody
public void queryString(@RequestParam(required = true) String username){
System.out.println(username);
}
@RequestBody @Valid 設置入參校驗
@RequestMapping("/query")
@ResponseBody
public void query(@RequestBody @Valid User user){
System.out.println("query");
}
爲什麼2個註解都需要
@RequestBody的required默認爲true,所以@RequestBody 和 @RequestBody(required=true) 一樣。
那麼爲什麼只設置@RequestBody(required=true) 即使入參爲空也不報錯?
是這樣的, 如果入參爲空,那麼仍然創建了一個User對象,只不過屬性都是空字符串。
所以需要加上@Valid,檢驗User類的屬性。
User類代碼
@Data
public class User {
@NotBlank(message = "姓名不能爲空")
private String username;
private String password;
}