創建restful應用
步驟:
1:建立要操作的bean,並生成getter,setter
2: 建立對bean的CURD操作service類完成操作及存儲
3: 建立@RestController修飾的apiController,RequestMapping定義的接口需要是rest風格
@RequestMapping(value = "/users", method = RequestMethod.GET)
@RequestMapping(value = "/users", method = RequestMethod.POST)
@RequestMapping(value = "/user/{email}", method = RequestMethod.PUT)
@RequestMapping(value = "/user/{email}", method = RequestMethod.DELETE)
說明:
默認情況下, Spring 會略去URL點號後面的內容,解決方案是在配置文件中添加配置
configurer.setUseRegisteredSuffixPatternMatch(true);
如下:
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseRegisteredSuffixPatternMatch(true);
}
默認情況下,Spring Boot 所使用的 JSON 序列化庫 Jackson 會將所有能夠通過 getter 方法訪問的內容都進行序列化。 可以在類 級別使用@JsonIgnoreProperties 註解,定義想要忽略的一組屬性,也可以在想要忽略的屬性所對應的 getter 方法上,添加@JsonIgnore 註解。
如果不是我們自己的類,我們並沒有辦法爲其添加註解。 直接序列化模型類通常來講並不是好的方案,它會將你的模型類與序列化庫關聯在一 起,所使用的序列化庫是具體的實現細節,所以不應該將其與模型進行關聯。
當處理不可修改的代碼時,Jackson 提供了兩個方案:
¿ 創建專門用於序列化功能的新類;
¿ 使用混入(mixin),這是與模型相關聯的簡單類。它們會在你自己的代碼中聲明,
能夠使用任意的 Jackson 註解。
因爲我們只是對模型類中的域進行簡單的轉換(一些會隱藏,還有個別的要重命名),
我們可以選擇混入的方案。
這是一種很好的非侵入式的方式,可以通過簡單的類或接口在運行時重命名或排除相
關的域。
另外一種指定域子集的方式就是使用@JsonView 註解,這樣這些域的子集就可以用到
應用程序的其他地方了。我推薦你閱讀這篇很棒的 博客文章:https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring。
返回值中包含狀態碼與異常處理
步驟:
1:api接口的返回值必須是ResponseEntity<>類型
2:在代碼中返回相對應的錯誤信息
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
if (!userRepository.exists(user.getEmail())) {
status = HttpStatus.CREATED;
}
User saved = userRepository.save(user);
return new ResponseEntity<>(saved, status);
說明:
使用異常處理狀態碼
步驟
1:定義對應的自定義異常
2:api接口的返回值必須是ResponseEntity<>類型
3:bean操作中發現相對應的錯誤或者異常,並逐層向上拋出異常
4:建立使用@ControllerAdvice標註的異常處理類,處理對應的異常信息,注意以下處理的異常和對應的錯誤提示註解
@ExceptionHandler(EntityNotFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Entity
could not be found")
說明
通過爲 bean 添加@ControllerAdvice 註解,我們能夠爲一組控制器添加額外的行爲。這
些控制器通知可以用來處理異常,也可以通過@ModelAttribute 來聲明模型屬性,或通過
@InitBinder 聲明校驗策略。
藉助剛剛編寫的代碼,我們就能處理控制器拋出的所有 EntityNotFoundException 異常,
並將其與 404 狀態進行關聯。我們可以抽象這種理念並確保應用的所有控制器按照一致的
方式來進行處理。
在當前的級別下,我們還沒有在 API 處理中處理超鏈接。我建議你去了解一下 Spring
HATEOAS 和 Spring Data REST,它們提供了非常優雅的方案,能夠讓你的資源更容易被發現。
利用swagger實現文檔化
步驟:
1:添加依賴
compile 'io.springfox:springfox-swagger2:2.1.2'
compile 'io.springfox:springfox-swagger-ui:2.1.2'
2:在配置文件添加支持註解
@EnableSwagger2
3:訪問文檔地址:http://localhost:8080/swagger-ui.html
說明
compile 'io.springfox:springfox-swagger2:2.1.2'
compile 'io.springfox:springfox-swagger-ui:2.1.2'
第一項依賴提供了一個註解,藉助它能夠在我們的應用中啓用 Swagger 功能,它還提
供了一個 API,用來通過註解描述資源。Swagger 會生成 API 的 JSON 格式表述。
第二項依賴是一個 WebJar,其中包含了靜態資源,這些資源會以 Web 客戶端的形式使
用前面所生成的 JSON。
在我們的場景下,我們只想暴露這一個 API:
@Bean
public Docket userApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.paths(path -> path.startsWith("/api/"))
.build();
}
Springfox 會與一組 Docket 協同工作,這些 Docket 需要在配置類中定義爲 bean。它們
是 RESTful 資源的邏輯分組,一個應用可以包含很多組。
讀者可以參考它的文檔(http://springfox.github.io/springfox)來了解所有不同的設置方式。
生成XML報文
步驟:
1:添加jar包依賴
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
2:在postMan中報文頭添加Accept,用來分別支持json和xml
Accept:application/json
Accept:application/xml
說明:
默認情況下,將會按照應用所定義的內容協商策略解析正確的內容。你可以看一下 ContentNegotiationManagerFactoryBean 類,瞭解這些策略在 Spring MVC中是如何運用的。
內容類型可以通過如下的策略來進行解析:
按照客戶端發送的 Accept 頭信息;
藉助類似於“?format=json”這樣的參數;
藉助路徑擴展名,如“/myResource.json”或“/myResource.xml”。
你可以在 Spring 配置中自定義這些策略,這需要重寫 WebMvcConfigurerAdapter 類的 configureContentNegotiation()方法。