3

我有一个 ArgumentResolver,我在其中定义了分页的后备情况:

public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
        resolver.setFallbackPageable(new PageRequest(0, 5, Direction.DESC, "id"));
        argumentResolvers.add(resolver);
    }
}

这就是我的控制器方法的样子:

@RequestMapping(RequestMappings.SHOW_ALL_ITEMS)
public String showAllItems(Model model, Pageable pageable) {

    PageWrapper<Item> page = new PageWrapper<Item> 
        (itemService.getAllItems(pageable), RequestMappings.SHOW_ALL_ITEMS);
    model.addAttribute("page", page);

    return ViewNamesHolder.SHOW_ALL_ITEMS;
}

如果我想要另一个具有不同回退情况的控制器方法怎么办?我知道我可以注册许多参数解析器对象。但是在这种情况下,我如何定义在控制器方法中使用哪一个呢?:

public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableHandlerMethodArgumentResolver resolverWithSizeFive = new PageableHandlerMethodArgumentResolver();
        resolverWithSizeFive.setFallbackPageable(new PageRequest(0, 5, Direction.DESC, "id"));
        argumentResolvers.add(resolverWithSizeFive);

        PageableHandlerMethodArgumentResolver resolverWithSizeTen = new PageableHandlerMethodArgumentResolver();
        resolverWithSizeTen.setFallbackPageable(new PageRequest(0, 10, Direction.DESC, "id"));
        argumentResolvers.add(resolverWithSizeTen);
    }
}
4

1 回答 1

2

HandlerMethodArgumentResolver实例按注册顺序进行检查。

Spring 首先注册默认的基于注解的参数解析器,然后是基于类型的参数解析器,然后是您的自定义解析器,然后是一些包罗万象的解析器。你可以在 中看到这些RequestMappingHandlerAdapter#getDefaultArgumentResolvers()

在您的情况下,要区分Pageable一个处理程序方法与Pageable另一种处理程序方法,我能想到的唯一方法是子类化并注册您自己的PageableHandlerMethodArgumentResolver实例,即。每种类型的后备都有一个,用于检查自定义注释,该注释在其supportsParameter方法中标识可分页的后备。

于 2013-11-04T20:42:07.323 回答