Class NarrowPageableHandlerMethodArgumentResolver

  • All Implemented Interfaces:
    org.springframework.data.web.PageableArgumentResolver, org.springframework.web.method.support.HandlerMethodArgumentResolver

    public class NarrowPageableHandlerMethodArgumentResolver
    extends Object
    implements org.springframework.data.web.PageableArgumentResolver
    More flexible resolver for Pageable implementation based on additional 'offset' and 'forward' request params that relate to UnnumberedPageable and NarrowedPageable, respectively. By providing different output based on request params, well known patterns involving Pageable and PageableDefault params can continue to be leveraged in endpoint classes. Furthermore, narrowing behavior for a request can be changed on-the-fly (see ContextInfo.isIgnoreNarrowing()) and a NarrowedPageable will still work correctly to resolve a page of records through vanilla Spring repository support. This means that the more derived Pageable types are still backwards compatible with the less enhanced fetch flows.

    The default behavior is to provide the out-of-box Spring Data implementation of Pageable when the 'offset' request parameter is omitted from the request. Next, if 'offset' is included, but 'forward' is omitted, it will provide an implementation of UnnumberedPageable. Finally, should both 'offset' and 'forward' be supplied, it will provide an implementation of NarrowedPageable.

    Author:
    Jeff Fischer
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      String getForwardParameterName()
      Retrieves the parameter name to be used to determine if this pageable request is incrementally moving forward through the result set, or in reverse.
      protected int getMaxPageSize()
      Retrieves the maximum page size to be accepted.
      String getOffsetParameterName()
      Retrieves the parameter name to be used to determine the number of records to offset.
      protected String getPageParameterName()
      Retrieves the parameter name to be used to find the page number in the request.
      protected String getSizeParameterName()
      Retrieves the parameter name to be used to find the page size in the request.
      boolean isFallbackPageable​(org.springframework.data.domain.Pageable pageable)
      Returns whether the given Pageable is the fallback one.
      protected boolean isOneIndexedParameters()
      Indicates whether to expose and assume 1-based page number indexes in the request parameters.
      org.springframework.data.domain.Pageable resolveArgument​(org.springframework.core.MethodParameter methodParameter, org.springframework.web.method.support.ModelAndViewContainer mavContainer, org.springframework.web.context.request.NativeWebRequest webRequest, org.springframework.web.bind.support.WebDataBinderFactory binderFactory)  
      void setFallbackPageable​(org.springframework.data.domain.Pageable fallbackPageable)
      Configures the Pageable to be used as fallback in case no PageableDefault or PageableDefault (the latter only supported in legacy mode) can be found at the method parameter to be resolved.
      void setForwardParameterName​(String forwardParameterName)
      Sets the parameter name to be used to determine if this pageable request is incrementally moving forward through the result set, or in reverse.
      void setMaxPageSize​(int maxPageSize)
      Configures the maximum page size to be accepted.
      void setOffsetParameterName​(String offsetParameterName)
      Sets the parameter name to be used to determine the number of records to offset.
      void setOneIndexedParameters​(boolean oneIndexedParameters)
      Configures whether to expose and assume 1-based page number indexes in the request parameters.
      void setPageParameterName​(String pageParameterName)
      Configures the parameter name to be used to find the page number in the request.
      void setPrefix​(String prefix)
      Configures a general prefix to be prepended to the page number and page size parameters.
      void setQualifierDelimiter​(String qualifierDelimiter)
      The delimiter to be used between the qualifier and the actual page number and size properties.
      void setSizeParameterName​(String sizeParameterName)
      Configures the parameter name to be used to find the page size in the request.
      boolean supportsParameter​(org.springframework.core.MethodParameter parameter)  
    • Constructor Detail

      • NarrowPageableHandlerMethodArgumentResolver

        public NarrowPageableHandlerMethodArgumentResolver()
      • NarrowPageableHandlerMethodArgumentResolver

        public NarrowPageableHandlerMethodArgumentResolver​(org.springframework.data.web.SortHandlerMethodArgumentResolver sortResolver)
      • NarrowPageableHandlerMethodArgumentResolver

        public NarrowPageableHandlerMethodArgumentResolver​(org.springframework.data.web.SortArgumentResolver sortResolver)
    • Method Detail

      • supportsParameter

        public boolean supportsParameter​(org.springframework.core.MethodParameter parameter)
        Specified by:
        supportsParameter in interface org.springframework.web.method.support.HandlerMethodArgumentResolver
      • resolveArgument

        public org.springframework.data.domain.Pageable resolveArgument​(org.springframework.core.MethodParameter methodParameter,
                                                                        org.springframework.web.method.support.ModelAndViewContainer mavContainer,
                                                                        org.springframework.web.context.request.NativeWebRequest webRequest,
                                                                        org.springframework.web.bind.support.WebDataBinderFactory binderFactory)
        Specified by:
        resolveArgument in interface org.springframework.web.method.support.HandlerMethodArgumentResolver
        Specified by:
        resolveArgument in interface org.springframework.data.web.PageableArgumentResolver
      • setFallbackPageable

        public void setFallbackPageable​(org.springframework.data.domain.Pageable fallbackPageable)
        Configures the Pageable to be used as fallback in case no PageableDefault or PageableDefault (the latter only supported in legacy mode) can be found at the method parameter to be resolved.

        If you set this to Optional#empty(), be aware that you controller methods will get null handed into them in case no Pageable data can be found in the request. Note, that doing so will require you supply bot the page and the size parameter with the requests as there will be no default for any of the parameters available.

        Parameters:
        fallbackPageable - the Pageable to be used as general fallback.
      • isFallbackPageable

        public boolean isFallbackPageable​(org.springframework.data.domain.Pageable pageable)
        Returns whether the given Pageable is the fallback one.
        Parameters:
        pageable - can be null.
        Returns:
        Since:
        1.9
      • setMaxPageSize

        public void setMaxPageSize​(int maxPageSize)
        Configures the maximum page size to be accepted. This allows to put an upper boundary of the page size to prevent potential attacks trying to issue an OutOfMemoryError. Defaults to DEFAULT_MAX_PAGE_SIZE.
        Parameters:
        maxPageSize - the maxPageSize to set
      • getMaxPageSize

        protected int getMaxPageSize()
        Retrieves the maximum page size to be accepted. This allows to put an upper boundary of the page size to prevent potential attacks trying to issue an OutOfMemoryError. Defaults to DEFAULT_MAX_PAGE_SIZE.
        Returns:
        the maximum page size allowed.
      • setPageParameterName

        public void setPageParameterName​(String pageParameterName)
        Configures the parameter name to be used to find the page number in the request. Defaults to page.
        Parameters:
        pageParameterName - the parameter name to be used, must not be null or empty.
      • getPageParameterName

        protected String getPageParameterName()
        Retrieves the parameter name to be used to find the page number in the request. Defaults to page.
        Returns:
        the parameter name to be used, never null or empty.
      • setSizeParameterName

        public void setSizeParameterName​(String sizeParameterName)
        Configures the parameter name to be used to find the page size in the request. Defaults to size.
        Parameters:
        sizeParameterName - the parameter name to be used, must not be null or empty.
      • getSizeParameterName

        protected String getSizeParameterName()
        Retrieves the parameter name to be used to find the page size in the request. Defaults to size.
        Returns:
        the parameter name to be used, never null or empty.
      • setPrefix

        public void setPrefix​(String prefix)
        Configures a general prefix to be prepended to the page number and page size parameters. Useful to namespace the property names used in case they are clashing with ones used by your application. By default, no prefix is used.
        Parameters:
        prefix - the prefix to be used or null to reset to the default.
      • setQualifierDelimiter

        public void setQualifierDelimiter​(String qualifierDelimiter)
        The delimiter to be used between the qualifier and the actual page number and size properties. Defaults to _. So a qualifier of foo will result in a page number parameter of foo_page.
        Parameters:
        qualifierDelimiter - the delimiter to be used or null to reset to the default.
      • setOneIndexedParameters

        public void setOneIndexedParameters​(boolean oneIndexedParameters)
        Configures whether to expose and assume 1-based page number indexes in the request parameters. Defaults to false, meaning a page number of 0 in the request equals the first page. If this is set to true, a page number of 1 in the request will be considered the first page.
        Parameters:
        oneIndexedParameters - the oneIndexedParameters to set
      • isOneIndexedParameters

        protected boolean isOneIndexedParameters()
        Indicates whether to expose and assume 1-based page number indexes in the request parameters. Defaults to false, meaning a page number of 0 in the request equals the first page. If this is set to true, a page number of 1 in the request will be considered the first page.
        Returns:
        whether to assume 1-based page number indexes in the request parameters.
      • getForwardParameterName

        public String getForwardParameterName()
        Retrieves the parameter name to be used to determine if this pageable request is incrementally moving forward through the result set, or in reverse. Defaults to forward. This parameter is only used when the request is targeting NarrowedPageable.
        Returns:
        the parameter name to be used
      • setForwardParameterName

        public void setForwardParameterName​(String forwardParameterName)
        Sets the parameter name to be used to determine if this pageable request is incrementally moving forward through the result set, or in reverse. Defaults to forward. This parameter is only used when the request is targeting NarrowedPageable.
        Parameters:
        forwardParameterName - the parameter name to be used
      • getOffsetParameterName

        public String getOffsetParameterName()
        Retrieves the parameter name to be used to determine the number of records to offset. Defaults to offset. This parameter is only used when the request is targeting UnnumberedPageable and NarrowedPageable.
        Returns:
        the parameter name to be used
      • setOffsetParameterName

        public void setOffsetParameterName​(String offsetParameterName)
        Sets the parameter name to be used to determine the number of records to offset. Defaults to offset. This parameter is only used when the request is targeting UnnumberedPageable and NarrowedPageable.
        Parameters:
        offsetParameterName - the parameter name to be used