成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

都2025年了,Spring Boot開發(fā)中的這些錯誤不要再犯了

開發(fā) 前端
現(xiàn)在是2025年了,但我仍然看到開發(fā)者,無論是初學(xué)者還是經(jīng)驗豐富的開發(fā)者,都在犯同樣的本可避免的錯誤。關(guān)鍵是有些錯誤反而寫入了公司的規(guī)范中。

環(huán)境:SpringBoot3.4.2

1. 簡介

Spring Boot是一個基于Spring框架的輕量級開發(fā)框架,它簡化了基于Spring的應(yīng)用開發(fā)。通過提供默認配置和一系列開箱即用的工具,Spring Boot使得開發(fā)者能夠快速構(gòu)建獨立、生產(chǎn)級別的Spring應(yīng)用。它采用“約定優(yōu)于配置”的理念,大大減少了XML配置的使用,讓開發(fā)者能夠更加專注于業(yè)務(wù)邏輯的實現(xiàn)。

現(xiàn)在是2025年了,但我仍然看到開發(fā)者,無論是初學(xué)者還是經(jīng)驗豐富的開發(fā)者,都在犯同樣的本可避免的錯誤。關(guān)鍵是有些錯誤反而寫入了公司的規(guī)范中。

2. 不該犯的錯

2.1 暴露敏感數(shù)據(jù)

這種錯誤是非常致命的,稍有不慎就可能將非常關(guān)鍵的數(shù)據(jù)暴露給了用戶。如下示例:

@RestController
@RequestMapping("/users")
public class UserController {


  @Resource
  private UserRepository userRepository;


  @GetMapping("/{id}")
  public User getUser(@PathVariable Long id) {
    return userRepository.findById(id).orElseThrow() ;
  }
}

應(yīng)該有不少公司都還在這樣做吧,直接將實體對象返回到客戶端。看起來無害,對吧?錯!如果你的User實體包含像密碼這樣的敏感字段怎么辦?即使你在它們上面加上了@JsonIgnore注解,你仍然是在暴露內(nèi)部實現(xiàn)細節(jié)。

解決方法 始終使用 DTO(數(shù)據(jù)傳輸對象)。如果你使用的Java版本是14以上,那么你可以直接使用record類型,如下示例:

public record UserDTO(Long id, String name, String email) {}

2.2 為什么不用Records

如果你已經(jīng)使用上了Java 14以上的版本,那么在編寫那種不可變的POJO對象時請使用record,不要再像如下定義了:

public class UserResponse {
  private final String username ;
  private final Integer age ;
  public UserVO(String username, Integer age) {
    this.username = username ;
    this.age = age ;
  }
  // getters, setters
}

使用Records一行代碼搞定了:

public record UserResponse(String username, Integer age) {}

代碼更少,更清晰。

2.3 字段注入還在使用注解方式

很多開發(fā)者把@Autowired/@Reosurce當(dāng)作魔杖一樣使用。問題在于,對于構(gòu)造器注入來說,它完全是不必要的。

@Service
public class UserService {


  @Resource
  private UserRepository userRepository ;
}

正確的方式:

@Service
public class UserService {    


  private final UserRepository userRepository ;        
  public UserService(UserRepository userRepository) {        
    this.userRepository= userRepository ;    
  }
}

更簡潔、更易測試,并且避免了不必要的反射開銷。

2.4 還在使用RestTemplate

RestTemplate是基于阻塞IO的,在訪問量比較大的情況下,它可能會給業(yè)務(wù)系統(tǒng)帶來壓力,甚至影響到系統(tǒng)的穩(wěn)定性和可用性。并且RestTemplate目前處于維護模式,官方更推薦采用WebClient作為替代方案,以利用其基于Reactor的響應(yīng)式編程模型,實現(xiàn)非阻塞的HTTP客戶端功能。如下示例:

@Service
public class PaymentService {
  private final WebClient webClient;


  public PaymentService(WebClient.Builder webClientBuilder) {
    this.webClient = webClientBuilder.baseUrl("https://www.payment.com/api").build();
  }
  public Mono<PaymentResponse> processPayment(PaymentRequest request) {
    return webClient.post()
            .uri("/pay")
            .bodyValue(request)
            .retrieve()
            .bodyToMono(PaymentResponse.class);
  }
}

官方的建議如下:

圖片圖片

2.5 臃腫的Controller

一股腦的將所有的東西都堆到Controller層,這非常容易讓你的代碼變得難以維護。

錯誤示例:

@RestController
@RequestMapping("/users")
public class UserController {
  @Resource
  private UserRepository userRepository;
  @GetMapping("/{id}")
  public User getUser(@PathVariable Long id) {
    return userRepository.findById(id).orElseThrow() ;
  }
}

這樣應(yīng)該是常識性錯誤吧。

正確示例:

@Service
public class UserService {
  private final UserRepository userRepository;
  public User getUser(Long id) {
    return userRepository.findById(id).orElseThrow() ;
  }
}
// Controller中調(diào)用該Service

確保控制器只能處理 HTTP 請求,而不能處理業(yè)務(wù)邏輯。

2.6 忽視的異常處理

不要再對于任何的錯誤都返回RuntimeException異常,而是應(yīng)該精細化的控制異常,如:查詢指定id用戶,如果不存在應(yīng)該返回404,而不是500錯誤。

錯誤示例:

@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
  return userRepository.findById(id)
    .orElseThrow(() -> new RuntimeException("用戶不存在"));
}

RuntimeException是一種未檢查的異常,除非明確處理,否則會冒泡到Spring的默認異常處理器。Spring對于未處理異常的默認行為是返回500內(nèi)部服務(wù)器錯誤。

正確示例:

使用自定義異常和全局異常處理程序。

@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {
  public UserNotFoundException(String message) {
    super(message) ;
  }
}

當(dāng)拋出該異常后,默認情況下,Spring MVC會通過ResponseStatusExceptionResolver進行處理,它會直接發(fā)送錯誤信息(狀態(tài)碼為404)到客戶端不夠優(yōu)雅;我們可以通過自定義的全局異常進行處理:

@RestControllerAdvice
public class GlobalExceptionHandler {
  @ExceptionHandler(UserNotFoundException.class)
  public ResponseEntity<String> handleNotFound(UserNotFoundException ex) {
    return ResponseEntity
      .status(HttpStatus.NOT_FOUND)
      .body("用戶不存在, " + ex.getMessage()) ;
  }
}
責(zé)任編輯:武曉燕 來源: Springboot全家桶實戰(zhàn)案例
相關(guān)推薦

2020-12-17 10:55:54

SQL數(shù)據(jù)庫語言

2021-01-01 14:37:51

SQL數(shù)據(jù)庫語言

2024-07-05 08:37:33

2020-07-01 07:38:38

SQL數(shù)據(jù)庫程序員

2025-01-08 14:31:06

2017-11-02 15:42:32

開發(fā)錯誤代碼

2022-09-28 08:40:52

CIO工具軟件

2019-11-11 22:37:35

Google收購失敗

2021-06-11 09:33:33

索引SQL語句

2015-04-28 10:35:01

設(shè)計

2019-02-12 11:15:15

Spring設(shè)計模式Java

2022-10-08 06:49:32

LinuxWindows操作系統(tǒng)

2025-01-07 08:21:03

2022-09-16 11:41:17

Spring代碼

2021-12-14 18:20:23

Github技巧前端

2022-10-17 07:40:21

AI項目數(shù)據(jù)

2021-01-14 21:37:01

JavaScript開發(fā)代碼

2021-12-14 07:40:07

企業(yè)內(nèi)部開源

2022-09-20 10:22:00

CIOIT業(yè)務(wù)管理者

2016-01-11 09:45:32

網(wǎng)絡(luò)預(yù)言網(wǎng)絡(luò)趨勢
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美白人做受xxxx视频 | 中文字幕一区二区三区精彩视频 | 亚洲精彩视频在线观看 | 精品国产乱码一区二区三区 | 99热最新网址| 99精品久久久 | 国产午夜精品久久久久 | 国内精品久久久久久久影视简单 | 亚洲精品1区2区3区 91免费看片 | 欧美成视频 | 99久久国产综合精品麻豆 | 成人在线免费观看av | 免费在线国产视频 | 国产免费av网| 欧美久久久久久久 | 亚洲天天干 | 国产精品大片 | 黄a网| 亚洲a视频 | 久久黄色网 | 国产精品一区二区三 | 精品久久久久久久人人人人传媒 | 99视频在线| 日本一区二区不卡 | 中文字幕精品一区 | 国产精品久久久久久二区 | 国产精品久久一区二区三区 | 一二区成人影院电影网 | 日本久久一区二区三区 | 成人在线一级片 | 久久美国 | 欧美日韩国产一区二区三区 | 国产成人精品久久二区二区91 | 久久精品日 | 免费成人午夜 | h视频在线免费 | 91av在线免费播放 | 国产 日韩 欧美 在线 | 久久久久国产 | 免费不卡av| 久久久激情视频 |