[英]Spring MVC @Valid Validation with custom HandlerMethodArgumentResolver
我想注冊一個可以處理以下@Controller
處理程序方法定義的自定義HandlerMethodArgumentResolver
@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {
我可以通過覆蓋來自WebMvcConfigurerAdapter
addArgumentResolver()
來注冊我的解析器,它只是通過請求參數創建一個Domain
對象。 當Spring嘗試解析Domain
參數時,它會通過它的HandlerMethodArgumentResolver
列表(有很多)並選擇第一個supports()
它。
在上面的例子中,雖然我的解析器將被調用,我的Domain
說法將得到初始化, @Valid
注釋將不會被處理和分解BindingResult
,一個ErrorsMethodArgumentResolver
會,因為它需要一個失敗@ModelAttribute
, @RequestBody
或處理程序方法中的@RequestPart
參數,我沒有。
如果我嘗試通過添加@ModelAttribute
來修復它
@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid @ModelAttribute Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {
將首先使用supports()
檢查HandlerMethodArgumentResolver
實現ModelAttributeMethodProcessor
,並在我的自定義解析器之前解析參數(使用@ModelAttribute
和@Valid
)。 BindingResult
不會失敗,但我不會在Domain
實例上擁有自定義創建行為。
我可以復制粘貼代碼進行驗證並添加到ModelAttributeMethodProcessor
模型,但我希望有一種更簡單的方法來解析我的參數並執行驗證而無需向模型添加對象。 有這樣的方式嗎?
很好地描述了您所面臨的問題。
我檢查了你已經概述的代碼並得出了相同的結論 - 沒有內置方法同時應用自定義HandlerMethodArgumentResolver
以及@Valid
相關驗證,唯一的選擇是執行ModelAttributeMethodProcessor
所做的操作,檢查參數是否具有@Valid
注釋並調用與驗證邏輯相關的代碼。
你可以從ModelAttributeMethodProcessor
派生你的HandlerMethodResolverArgumentResolver
並調用super.validateIfApplicable(..)
至少以這種方式利用現有代碼。
這可能為時已晚,但您的HandlerMethodArgumentResolver
將WebDataBinderFactory
對象作為最后一個參數獲取,然后,為了掛鈎驗證,只需將其添加到您的解析器實現中:
Object resolvedObject = // your logic
if(parameter.hasParameterAnnotation(Valid.class){
binderFactory.createBinder(webRequest,resolvedObject,"resolvedObjectLogicalName").validate ();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.