簡體   English   中英

Spring 可以在通用 controller 中設置 @RequestBody 的值嗎?

[英]Can Spring set the values of a @RequestBody in a generic controller?

我有一個通用的 controller 和一個使用一些通用類映射 POST 請求的 create() 方法。 我創建了 controller 的子類,它提供特定的服務和 DTO 類型。

理論上,子類 controller 應該不需要實現自己的 create() 方法。 但是,我發現,如果我沒有在子類中實現 create() 方法,那么當我發出請求時,@RequestBody 參數就沒有得到正確設置。

超類

public abstract class GenericController<InputDtoClass, ModelClass> {
    @PostMapping
    public @ResponseBody ModelClass create(@Valid @RequestBody InputDtoClass input) {
        return service.create(input);
    }
}

小類

@RestController
@RequestMapping("/my/api/path")
public class SpecificController extends GenericController<SpecificInputDto, SpecificModel> {

}

我期望的是,當我用一些數據調用 POST /my/api/path 時,我的程序應該調用超類的 create() 方法,將 SpecificInputD 填充為 object,然后驗證它。

該程序正確調用了超類的 create() 方法,並且根據 SpecificInputDto class 中的注釋字段正確地嘗試驗證輸入 object。但是輸入 object 本身沒有設置任何這些值。 (為了澄清,如果我刪除 @Valid 標記,我可以看到傳遞了正確類型的 object,所有字段均為空)。 考慮到該程序似乎可以很好地處理一般類型的查詢參數類,這尤其奇怪。 只是用 @RequestBody 注釋的字段沒有被填充,即使 Spring似乎知道它應該是什么特定類型。

編輯:如果我將通用 controller 更改為使用特定的 InputDto 類型,它也無法填充。 但是復制到子類中的完全相同的方法可以正常工作。

顯然,每次我使用 VSCode 的自動完成功能導入@RequestBody時,它都會決定導入io.swagger.v3.oas.annotations.parameters.RequestBody而不是org.springframework.web.bind.annotation.RequestBody

導入正確的RequestBody class 為我解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM