本篇文章,我們將討論每個 Spring Boot 開發(fā)人員在開發(fā)程序的過程中應(yīng)該要注意到的四個重要的提示。
1.使用@ModelAttribute注解
通常有部分的開發(fā)人員在請求參數(shù)會選擇使用 ?Map<String, String>
?
@GetMapping
public SomeDto getAll(@RequestParam Map<String, String> params)
雖然它沒有任何問題,但它缺少可讀性。如果另一個開發(fā)人員想知道支持哪些參數(shù),那么開發(fā)人員需要仔細(xì)閱讀代碼并且必須費力地找到所有參數(shù)。 此外,?Swagger 2.0
? 規(guī)范不支持 ?Map<String, String>
?。
?@ModelAttribute
?注解可用于將請求參數(shù)映射到 Java 對象。Java 對象可以具有 API 期望的所有請求參數(shù)。這樣你就可以在 java 對象上使用所有 ?javax
?驗證。
@GetMapping
public SomeDto getAll(@Valid @ModelAttribute SomeObject params)
2.使用Feign Client時,使用@Controlleradvice處理所有未處理的Feignexception
為所有 FeignException 設(shè)置一個全局異常處理程序是很好的。大多數(shù)情況下,都希望發(fā)送與底層服務(wù)發(fā)送的相同的錯誤響應(yīng)。
樣品處理
@RequiredArgsConstructor
@ControllerAdvice
public 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;
}
}
}
3. 避免為集成測試而啟動 Spring 應(yīng)用程序上下文
對于集成測試,很多人很可能會使用 ?@SpringBootTest
? 注釋測試類;此注釋的問題在于它將啟動整個應(yīng)用程序上下文。但有時候你也可以避免它,考慮到你只是在測試服務(wù)層,而唯一需要的是 JPA 連接。
在這種情況下,可以使用?@DataJpaTest
?注釋來啟動 ?JPA
?組件和存儲庫 ?bean
?。并使用?@Import
? 注釋加載服務(wù)類本身。
@DataJpaTest(showSql = false)
@Import(TestService.class)
public class ServiceTest {
@Autowired
private TestService service;
@Test
void testFindAll() {
List<String> values = service.findAll();
assertEquals(1, values.size());
}
}
4. 避免為每個 Spring Profile 創(chuàng)建多個屬性文件
如果你希望你的項目中只有一個配置 (?application.yml
?) 文件,那么你可以使用三個破折號分隔每個配置文件配置。
api.info:
title: rest-serice
description: some description
version: 1.0client.url: http://dev.server
---
spring.config.activate.on-profile: integration-test
client.url: http://mock-server
---
spring.config.activate.on-profile: prod
client.url: http://real-server
上面的示例中可以看到,有三個部分,它們由三個破折號分隔。第一部分是為所有彈簧配置文件啟用的通用屬性。第二部分用于集成測試彈簧配置文件,第三部分用于產(chǎn)品配置文件。