javax的Valid註解對泛型失效

我們知道javax的@Valid註解的效果是遞歸下去的。比如有一個如下的Controller:


request的結構分別如下:



那麼QueryContractRequest的chainId字段上面的Min註解是會生效的。

但是,如果ApiBaseRequest的定義如下,及使用了泛型,那麼QueryContractRequest的chainId字段上面的Min註解不會生效。



爲什麼呢?

因爲javax的校驗實現ValidatorImpl.validate(T object, Class<?>... groups)(是hibernate包裏的),讀取了最外層類型的編譯時結構,而非運行時類型,所以泛型就失效了。

這裏面有個臨時變量ValueContext.currentValidatable,這個屬性的值是BeanMetaDataManager.getBeanMetaData( object.getClass() ) 這個裏面取的是編譯時的類型,這個object就是某個參數,而非運行時。

ValidatorImpl.validateCascadedConstraints(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext)

裏面拿到一個屬性的value後,應該通過value.getClass()來重新計算設定類類型,這樣可以支持泛型。而非直接調用Cascadable(PropertyMetaData).getTypeArgumentsConstraints()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章