App下載

每個 Spring Boot 開發(fā)人員都應(yīng)該知道的技巧

打不倒的小乖獸 2021-09-02 09:42:23 瀏覽數(shù) (2295)
反饋

本篇文章,我們將討論每個 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)品配置文件。


0 人點贊