SpringBoot開發中,你需要了解的技巧

使用@ModelAttribute註解

以前開發中,我們都習慣使用

Map的方式,如下所示:

@GetMappingpublic CustomerDto getAll(@RequestParam Map params)

雖然這麼寫並沒有任何問題,但它缺少可讀性。如果另一個開發人員想知道支援哪些引數,那麼開發人員需要仔細閱讀程式碼並且我們需要找到所有引數

此外,Swagger 2。0 規範不支援 Map

@ModelAttribute

註解可用於將請求引數對映到 Java 物件。Java 物件可以具有 API 期望的所有請求引數。這樣您就可以在 java 物件上使用所有 javax 驗證。

@GetMappingbrpublic CustomerDto getAll ( @Valid @ModelAttribute SomeObject params )

使用Feign Client時,用@Controlleradvice處理所有未處理的Feignexception

為所有 FeignException 設定一個全域性異常處理程式是很好的方法。大多數情況下,我們希望傳送與底層服務相同的錯誤響應。

@RequiredArgsConstructor@ControllerAdvicepublic class ExceptionControllerAdvice {private final ObjectMapper mapper;@ExceptionHandler(FeignException。class)public final ResponseEntity < String > handleFeignException(FeignException fex) { log。error(“Exception from downstream service call - ”, fex); HttpStatus status = Optional。ofNullable(HttpStatus。resolve(fex。status())) 。orElse(HttpStatus。INTERNAL_SERVER_ERROR); String body = Strings。isNullOrEmpty(fex。contentUTF8()) ? fex。getMessage() : fex。contentUTF(); return new ResponseEntity < > ( body, getHeadersWithContentType(body), status ); }private MultiValueMap < String, String > getHeadersWithContentType(String body) { HttpHeaders headers = new HttpHeaders(); String contentType = isValidJSON(body) ? “application/json” : “text/plain”; headers。add(HttpHeaders。CONTENT_TYPE, contentType); return headers; }private boolean isValidJSON(String body) { try { if (Strings。isNullOrEmpty(body)) return false; mapper。readTree(body); return true; } catch (JacksonException e) { return false; } }}

可以避免為整合測試啟動 Spring 應用程式上下文

對於整合測試,我們很可能會使用 @SpringBootTest 註釋測試類;此註釋的問題在於它將啟動整個應用程式上下文。但其實我們是可以避免它的,考慮到我們只是在測試服務層,唯一需要的是 JPA 連線。

在這種情況下,我們可以使用

@DataJpaTest

註釋來啟動 JPA 元件和儲存庫 bean。使用

@Import

註釋載入服務類本身。

@DataJpaTest(showSql = false)@Import(TestService。class)public class ServiceTest { @Autowired private TestService service; @Test void testFindAll() { List values = service。findAll(); assertEquals(1, values。size()); }}

可以避免為每個 Spring Profile 建立多個屬性檔案

怎麼能讓我們的系統中只有一個配置檔案(

application。yml

)呢?三個

破折號可以實現這個問題。我們用三個破折號可以分隔每個配置檔案配置。

api。info: title: rest-serice description: some description version: 1。0client。url: http://dev。server——-spring。config。activate。on-profile: integration-testclient。url: http://mock-server——-spring。config。activate。on-profile: prodclient。url: http://real-server

上面的程式碼,第一部分為基礎配置,第二部分為測試配置,第三部分為生產環境。這樣就可以避免了一個專案多個配置檔案的問題。