2017-10-18 67 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

相关问题