讓我們考慮一個帶有控制器和服務的 Spring Boot (Spring Data JPA) 應用程式,如下例所示:
processEntity()從資料庫中獲取一個物件并處理/更新它。publishEntity()是一個單獨的方法,再次從資料庫中獲取物件,并將其發布到另一個系統。它需要來自資料庫的物體的“最新”狀態。
我發現一些博客文章和文章建議不要在控制器中操作物體,即在事務范圍之外。所以我的課程是這樣的:
@Service
public SomeService {
@Transactional
public void processEntity(long id) {
final SomeEntity someEntity = entityRepository.findById(id);
// process entity...
entityRepository.save(someEntity);
}
@Transactional(readOnly = true)
public void publishEntity(long id) {
final SomeEntity someEntity = entityRepository.findById(id);
// publish entity to another system...
}
}
@RestController
public SomeController {
@GetMapping(path = "/api/entity")
public ResponseEntity<Void> getEntity() {
someService.processEntity(1);
someService.publishEntity(1);
}
}
這種做法合理嗎?或者對于這種用例有更好的模式嗎?如果processEntity將物體本身回傳給將其傳遞給的控制器,是否會被視為“不良做法” publishEntity?
uj5u.com熱心網友回復:
在您的控制器中回傳物體和接收物體通常是一種不好的做法和常見的問題來源(不要誤會我的意思,它確實有效,但除非您的用例如此簡單,否則您很可能在這樣做時會遇到一些限制) . 您應該改用DTO,它與您的物體是一個類似的類,但可以代表您的域模型(在您的情況下是您的物體)中的多個視圖。
使用 DTO 有多種原因:
- 它允許您的域模型和“公共”模型之間的關注點分離,允許您更改一個而無需更改另一個。
- 它允許您輕松擁有物體的多個視圖,而無需包含 Jackson 魔法注釋來包含或排除物體類中的某些屬性。
您可以在以下在線資源中閱讀更多相關資訊:https : //www.baeldung.com/java-dto-pattern。
如果您決定使用 DTO,還可以考慮使用如下映射器:
- 模型映射器
- 映射結構
我不太喜歡使用它們(我更喜歡自己做映射),但您可能會發現它們很有用。映射可以在服務層本身或控制器層中完成。每種方法都有優點和缺點,但我想說這真的取決于你的喜好。
uj5u.com熱心網友回復:
建議在控制器和服務之間使用 DTO 物件。如果您稍后決定洗掉資料庫并使用一些外部系統,那么控制器層將不會受到影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/364428.html
