JSON
使用Jackson jar包、@RequestBody、@ResponseBody注解,達到:
1. 請求JSON消息體映射為JAVA對象
2. 返回JAVA對象映射為JSON消息體
Step 1. 導入Jackson jar包:
Step 2. 在Spring MVC配置中加入annotation-driven,該配置可以確保@RequestBody、@ResponseBody、@Valid(用於請求校驗)注解可以被解析生效:
Step 3. 配置控制器掃描路徑:
Step 3. 此時編寫Controller,使用@RequestBody、@ResponseBody注解:
請求校驗
請求校驗一般包含兩個方面的校驗:
1. 請求參數的合法性校驗,例如格式校驗
該類校驗可通過在類定義時使用JSR 303進行數據校驗,可使用Hibernate Validator,當數據校驗有問題時,將會拋出org.springframework.web.bind.MethodArgumentNotValidException。
2. 業務邏輯校驗,例如系統規定網上店鋪不可重名
該類校驗,一般通過定制業務規則校驗代碼實現,可拋出自定義異常。
Step 1. 導入Hibernate Validator jar包:
Step 2. 在REST API交互使用到的類定義中使用JSR 303數據校驗注解,例如:
HTTP Status Code
1. 在Controller的目標方法上通過@ResponseStatus定義成功碼,例如需要PUT方法成功時返回204而不是200:
2. 對於通過定制的業務邏輯校驗拋出自定義異常的場景,可以在自定義異常類上加上@ResponseStatus定義Status Code,例如:
3. 對於JSR 303進行的數據校驗,返回的是400 Bad Request異常,這個一般無需額外定制。
4. 由於本例中要實現:
當異常出現時,需要返回具體的錯誤提示信息給客戶端(見“自定義錯誤”章節),實際上異常發生時返回的HTTP Status Code也是在該章節的自定義ExceptionHandler類中指定的。
自定義錯誤
由於HTTP Status Code只能給出一個籠統的錯誤提示,往往在實際項目中,當錯誤發生時,需要根據不同的錯誤返回不同的錯誤信息,一般包含錯誤碼和錯誤描述。
對於業務規則校驗拋出的自定義異常和JSR 303拋出的MethodArgumentNotValidException,可以定制ExceptionHandler類來進行處理,在其中直接返回自定義的ErrorInfo對象或者通過返回Map的方式實現:
在上例中,在對應的方法上也加上了@ResponseStatus指定了返回的HTTP Status Code,實際上自定義異常類中使用@ResponseStatus注解標識的HTTP Status Code和JSR 303數據校驗未通過時設定的HTTP Status Code,都會在此處被覆蓋,如果在此處不設置@Response Status,很不幸將會默認返回表示正確的HTTP Status Code,例如200。