2017-10-18 71 views
1

所以我想最大分頁大小值限制爲10(例如值),我可以做到這一點像:添加相同類型的自定義解析器時,默認參數解析器發生了什麼?

@Configuration 
public class MvcConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
     super.addArgumentResolvers(argumentResolvers); 
     PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); 
     resolver.setMaxPageSize(10); 
     argumentResolvers.add(resolver); 
    } 
} 

和delcare這樣

@RequestMapping(name = "list") 
    public String listUsers(@PageableDefault(size = 5, page = 0) Pageable pageable) { 

事實上控制器的方法,這將工作,我無法將頁面大小設置爲> 10,但我很好奇爲什麼?春天發生的事情是PageableHandlerMethodArgumentResolver?爲什麼考慮這個實例而不是默認實例?畢竟,我不是在這裏取代解析器,而只是增加一個新的。

+0

的'HandlerMethodArgumentResolver'返回在'支撐件(MethodParameter)''TRUE'用於解析方法參數。如果添加的內容返回「true」,即使另一個解析器支持它,也使用該屬性。必須有別的東西怎麼回事,用戶添加的解析器可能會被優先春天不再添加其預設的解析器如果同一類型的解析器存在,但與我不知道。每個方法參數只有一個解析器。 –

回答

1

1.配置階段

當你擴展WebMvcConfigurerAdapter並添加自定義解析器在addArgumentResolvers,(跳過大量的配置代碼),你實際上是把它們添加到RequestMappingHandlerAdapterRequestMappingHandlerAdapter豆內部保存所有解析器的列表,提供初始化期間。 (WebMvcConfigurationSupport)。之後,它們與默認解析器結合使用。而且你可以從source code看到,PageableHandlerMethodArgumentResolver實際上不是默認的解析器列表的一部分,而是來自一些配置類。而在我的情況(下圖)的spring-boot-starter-data-rest配置類提供不同的版本PageableHandler的:HateoasPageableHandlerMethodArgumentResolver

2.旋轉變壓器訂單

定製解析器是有序的內置後的人(source)。因此,讓我們檢查一下並調用一些控制器,但首先在RequestMappingHandlerAdapter.invokeHandlerMethod()中放置斷點。從這裏我們可以看到RequestMappingHandlerAdapter

enter image description here

我強調了自定義解析MyPageableHandlerMethodArgumentResolver內部狀態,註冊你在你的問題的代碼一樣的工作方式。

和代碼,實際上解決的論點是HandlerMethodArgumentResolverComposite。這是簡單的循環,這意味着第一個註冊的HandlerMethodArgumentResolver將用於

for (HandlerMethodArgumentResolver methodArgumentResolver : this.argumentResolvers) 
    if (methodArgumentResolver.supportsParameter(parameter)) { 
     result = methodArgumentResolver; 
     this.argumentResolverCache.put(parameter, result); 
     break; 
    } 

而且你可以從源代碼中看到的,結果被高速緩存,並且永遠不會再對相同的參數類型重複。

+0

所以basicly來講,現在它的工作原理是一個巧合是嗎? - 作爲不相關的'@ Configuration'類的處理順序是不確定的,所以恰好我的配置最先出現。 – Antoniossss

+0

@Antoniossss我想是的,默認情況下,每個配置都有'LOWEST_PRECEDENCE',但是您可以使用'@ Order'來確保您的自定義配置的優先級。因此,當'列表'自動裝配在[DelegatingWebMvcConfiguration](https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/的servlet /配置/註解/ DelegatingWebMvcConfiguration。java#L48-L53),它根據bean的'order'內部排序。 – varren

+0

至於來自[SpringDataWebConfiguration]的解析器(https://github.com/spring-projects/spring-data-commons/blob/master/src/main/java/org/springframework/data/web/config/ SpringDataWebConfiguration.java#L138-L149),我想,它的配置方式是,如果你從這個類擴展,重寫'addArgumentResolvers'並且不要像'HateoasAwareSpringDataWebConfiguration'那樣調用super,你不會得到「default」解析器 – varren

相關問題