2017-06-12 22 views
1

Pageableprivate static final Sort sortById = new Sort(Sort.Direction.DESC, ID);を追加する必要があります。これを行う最善の方法は、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())); 
} 

}

私はIdSortArgumentResolverにデフォルトSortArgumentResolverを変更するにはどうすればよいですか?出来ますか?または多分それを行うには良い方法があります...それはspring-boot 1.5.2 RELEASEと現在のSortHandlerMethodArgumentResolver

P.SがSpringDataWebConfiguration

答えて

1

に設定されている注:あなたのポストに、あなたのクラス名はIdSortArgumentResolverですが、あなたのコンストラクタはIdSortArgumentResolverAdapterです。あなたのSortPageableリゾルバを

@Configuration 
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { 

    // ... 
} 

オーバーライドaddArgumentResolvers方法と設定::

WebMvcConfigurerAdapterを拡張する設定クラスを作成します

@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

spring-data-commonsバージョン2.0以降では、この種のものが容易になります2つの新しいクラスがありますされています

  • SortHandlerMethodArgumentResolverCustomizer
  • PageableHandlerMethodArgumentResolverCustomizer

残念ながらそれはに付属のバージョンではありません現在のバージョンのSpring Bootは、自己責任で置き換えてください。

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

この場合、おそらくresolveArgumentを呼び出して操作します。

Spring Data Web Support

関連する問題