2017-06-12 74 views
1

我需要将private static final Sort sortById = new Sort(Sort.Direction.DESC, ID);添加到每个Pageable。我想,最好的方法是为SortArgumentResolver创建修饰器/适配器。如何替换默认的SortArgumentResolver

我创建的类:

public class IdSortArgumentResolver implements SortArgumentResolver { 

private static final String ID = "id"; 
private static final Sort sortById = new Sort(Sort.Direction.DESC, ID); 
private final SortArgumentResolver delegate; 

public IdSortArgumentResolverAdapter(SortArgumentResolver delegate) { 
    this.delegate = delegate; 
} 

@Override 
public boolean supportsParameter(MethodParameter methodParameter) { 
    return delegate.supportsParameter(methodParameter); 
} 

@Override 
public Sort resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { 
    Sort sort = delegate.resolveArgument(parameter, mavContainer, webRequest, binderFactory); 
    if (isNull(sort)) { 
     return sortById; 
    } 
    if (containsSortById(sort)) { 
     return sort; 
    } 
    return sort.and(sortById); 
} 

private static boolean containsSortById(Sort currentSort) { 
    return StreamSupport.stream(currentSort.spliterator(), false) 
         .anyMatch(order -> ID.equalsIgnoreCase(order.getProperty())); 
} 

}

如何更改默认SortArgumentResolverIdSortArgumentResolver?可能吗?或者也许有更好的方法来做到这一点...

P.S这是spring-boot 1.5.2 RELEASE和电流SortHandlerMethodArgumentResolverSpringDataWebConfiguration

回答

1

注意配置:在您的文章,你的类名是IdSortArgumentResolver但你的构造函数是IdSortArgumentResolverAdapter

创建一个配置类扩展WebMvcConfigurerAdapter

@Configuration 
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { 

    // ... 
} 

覆盖的addArgumentResolvers方法,并配置SortPageable解析器:

@Override 
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
    // FIXME Replace null with what you want 
    SortArgumentResolver sortResolver = new IdSortArgumentResolver(null); 

    // For sorting resolution alone 
    argumentResolver.add(sortResolver); 

    PageableHandlerMethodArgumentResolver pageableResolver = new PageableHandlerMethodArgumentResolver(sortResolver); 

    // For sorting resolution encapsulated inside a pageable 
    argumentResolver.add(pageableResolver); 
} 

更好的解决方案没有自定义类:

@Override 
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
    SortHandlerMethodArgumentResolver sortResolver = new SortHandlerMethodArgumentResolver(); 

    sortResolver.setFallbackSort(new Sort(Sort.Direction.DESC, "id")); 

    // For sorting resolution alone 
    argumentResolver.add(sortResolver); 

    PageableHandlerMethodArgumentResolver pageableResolver = new PageableHandlerMethodArgumentResolver(sortResolver); 

    // For sorting resolution encapsulated inside a pageable 
    argumentResolver.add(pageableResolver); 
} 
1

2.0spring-data-commons版本开始,有2个新的类别,这将使这种容易的事情:

  • SortHandlerMethodArgumentResolverCustomizer
  • PageableHandlerMethodArgumentResolverCustomizer

不幸的是,这不是版本附带的当前版本的Spring Boot,因此请自行更换。

@Bean SortHandlerMethodArgumentResolverCustomizer sortCustomizer() { 
    // s is SortHandlerMethodArgumentResolver 
    return s -> s.setPropertyDelimiter("<-->"); 
} 

在这种情况下,可能会调用resolveArgument来操纵它。

Spring Data Web Support