2017-06-12 92 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