javascript
java spring mvc api_SpringMVC实现REST API
JSON
使用Jackson jar包、@RequestBody、@ResponseBody注解,達(dá)到:
1. 請(qǐng)求JSON消息體映射為JAVA對(duì)象
2. 返回JAVA對(duì)象映射為JSON消息體
Step 1. 導(dǎo)入Jackson jar包:
Step 2. 在Spring MVC配置中加入annotation-driven,該配置可以確保@RequestBody、@ResponseBody、@Valid(用于請(qǐng)求校驗(yàn))注解可以被解析生效:
Step 3. 配置控制器掃描路徑:
Step 3. 此時(shí)編寫Controller,使用@RequestBody、@ResponseBody注解:
請(qǐng)求校驗(yàn)
請(qǐng)求校驗(yàn)一般包含兩個(gè)方面的校驗(yàn):
1. 請(qǐng)求參數(shù)的合法性校驗(yàn),例如格式校驗(yàn)
該類校驗(yàn)可通過(guò)在類定義時(shí)使用JSR 303進(jìn)行數(shù)據(jù)校驗(yàn),可使用Hibernate Validator,當(dāng)數(shù)據(jù)校驗(yàn)有問(wèn)題時(shí),將會(huì)拋出org.springframework.web.bind.MethodArgumentNotValidException。
2. 業(yè)務(wù)邏輯校驗(yàn),例如系統(tǒng)規(guī)定網(wǎng)上店鋪不可重名
該類校驗(yàn),一般通過(guò)定制業(yè)務(wù)規(guī)則校驗(yàn)代碼實(shí)現(xiàn),可拋出自定義異常。
Step 1. 導(dǎo)入Hibernate Validator jar包:
Step 2. 在REST API交互使用到的類定義中使用JSR 303數(shù)據(jù)校驗(yàn)注解,例如:
HTTP Status Code
1. 在Controller的目標(biāo)方法上通過(guò)@ResponseStatus定義成功碼,例如需要PUT方法成功時(shí)返回204而不是200:
2. 對(duì)于通過(guò)定制的業(yè)務(wù)邏輯校驗(yàn)拋出自定義異常的場(chǎng)景,可以在自定義異常類上加上@ResponseStatus定義Status Code,例如:
3. 對(duì)于JSR 303進(jìn)行的數(shù)據(jù)校驗(yàn),返回的是400 Bad Request異常,這個(gè)一般無(wú)需額外定制。
4. 由于本例中要實(shí)現(xiàn):
當(dāng)異常出現(xiàn)時(shí),需要返回具體的錯(cuò)誤提示信息給客戶端(見(jiàn)“自定義錯(cuò)誤”章節(jié)),實(shí)際上異常發(fā)生時(shí)返回的HTTP Status Code也是在該章節(jié)的自定義ExceptionHandler類中指定的。
自定義錯(cuò)誤
由于HTTP Status Code只能給出一個(gè)籠統(tǒng)的錯(cuò)誤提示,往往在實(shí)際項(xiàng)目中,當(dāng)錯(cuò)誤發(fā)生時(shí),需要根據(jù)不同的錯(cuò)誤返回不同的錯(cuò)誤信息,一般包含錯(cuò)誤碼和錯(cuò)誤描述。
對(duì)于業(yè)務(wù)規(guī)則校驗(yàn)拋出的自定義異常和JSR 303拋出的MethodArgumentNotValidException,可以定制ExceptionHandler類來(lái)進(jìn)行處理,在其中直接返回自定義的ErrorInfo對(duì)象或者通過(guò)返回Map的方式實(shí)現(xiàn):
在上例中,在對(duì)應(yīng)的方法上也加上了@ResponseStatus指定了返回的HTTP Status Code,實(shí)際上自定義異常類中使用@ResponseStatus注解標(biāo)識(shí)的HTTP Status Code和JSR 303數(shù)據(jù)校驗(yàn)未通過(guò)時(shí)設(shè)定的HTTP Status Code,都會(huì)在此處被覆蓋,如果在此處不設(shè)置@Response Status,很不幸將會(huì)默認(rèn)返回表示正確的HTTP Status Code,例如200。
總結(jié)
以上是生活随笔為你收集整理的java spring mvc api_SpringMVC实现REST API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电路结构原理_精密半波、全波整流电路结构
- 下一篇: gradle idea java ssm