Разрешение Pageable в Webflux - PullRequest
0 голосов
/ 07 июня 2018

Я потратил много времени, чтобы найти решение о Pageable в Webflux, к сожалению, на момент написания этой статьи Webflux не поддерживал Pageable, поэтому я нашел решение, и это то, что я реализовал.Это хакерское решение для разрешения типа Pageable и Sort в контроллере / ресурсе Webflux в Spring Boot.

Вот решение: (Я знаю, что это может быть некрасиво, но вы можете использовать его, пока Spring Team не решит проблему,есть постоянные усилия для этого. Spring Jira

Кроме того, суть здесь: Github

Обновление 1: Вы можете найтистатья здесь, в среде , а также

Версии:

Spring Boot: 2.0.2.RELEASE
Gradle Kotlin: 1.2.41

Не стесняйтесь дать мне подсказку, чтобы улучшить его. (Код - Kotlin)

@Configuration
class PageableSerializer {

@Bean
@ConditionalOnMissingBean
fun pageableCustomizer(properties: SpringDataWebProperties): PageableHandlerMethodArgumentResolverCustomizer {
    return PageableHandlerMethodArgumentResolverCustomizer { resolver ->
        val pageable = properties.pageable

        resolver.setPageParameterName(pageable.pageParameter)
        resolver.setSizeParameterName(pageable.sizeParameter)
        resolver.setOneIndexedParameters(pageable.isOneIndexedParameters)
        resolver.setPrefix(pageable.prefix)
        resolver.setQualifierDelimiter(pageable.qualifierDelimiter)
        resolver.setFallbackPageable(PageRequest.of(0, pageable.defaultPageSize))
        resolver.setMaxPageSize(pageable.maxPageSize)

    }
}

@Bean
@ConditionalOnMissingBean
fun sortCustomizer(properties: SpringDataWebProperties): SortHandlerMethodArgumentResolverCustomizer {
    return SortHandlerMethodArgumentResolverCustomizer { resolver ->
        resolver.setSortParameter(properties.sort.sortParameter)
    }
}

@Bean
fun pageableHandler(pageableResolver: Optional<PageableHandlerMethodArgumentResolverCustomizer>, sortHandler: SortHandlerMethodArgumentResolver, reactiveAdapterRegistry: ReactiveAdapterRegistry): PageableHandlerMethodArgumentResolver {
    val handler = PageableHandlerMethodArgumentResolver(sortHandler)
    pageableResolver.ifPresent { c -> c.customize(handler) }
    return handler
}

@Bean
fun sortHandler(sortResolver: Optional<SortHandlerMethodArgumentResolverCustomizer>): SortHandlerMethodArgumentResolver {
    val handler = SortHandlerMethodArgumentResolver()
    sortResolver.ifPresent { c -> c.customize(handler) }
    return handler
}

}

И зарегистрировать обработчик:

@Component
class PageableResolver(registry: ReactiveAdapterRegistry, private val resolver: PageableHandlerMethodArgumentResolver) : HandlerMethodArgumentResolverSupport(registry) {

    override fun resolveArgument(parameter: MethodParameter, bindingContext: BindingContext, exchange: ServerWebExchange): Mono<Any> {
        return Mono.just(resolver.resolveArgument(parameter, null, MockNative(exchange.request.queryParams), null))
    }

    override fun supportsParameter(parameter: MethodParameter): Boolean {
        return this.resolver.supportsParameter(parameter)
    }

    private class MockNative(private val parameters: MultiValueMap<String, String>) : NativeWebRequest {
        override fun getParameter(paramName: String): String? {
            return this.parameters.getFirst(paramName)
        }

        override fun getParameterValues(paramName: String): Array<String>? {
            return this.parameters[paramName]?.toTypedArray()
        }

        override fun isUserInRole(role: String): Boolean {
            return false
        }

        override fun getRemoteUser(): String? {
            return null
        }

        override fun getLocale(): Locale {
            return Locale.getDefault()
        }

        override fun getParameterMap(): MutableMap<String, Array<String>> {
            return mutableMapOf()
        }

        override fun getSessionId(): String {
            return ""
        }

        override fun getAttributeNames(scope: Int): Array<String> {
            return arrayOf()
        }

        override fun registerDestructionCallback(name: String, callback: Runnable, scope: Int) {

        }

        override fun resolveReference(key: String): Any? {
            return null
        }

        override fun getHeaderValues(headerName: String): Array<String>? {
            return null
        }

        override fun getUserPrincipal(): Principal? {
            return null
        }

        override fun getDescription(includeClientInfo: Boolean): String {
            return ""
        }

        override fun getSessionMutex(): Any {
            return ""
        }

        override fun getNativeResponse(): Any? {
            return null
        }

        override fun <T : Any?> getNativeResponse(requiredType: Class<T>?): T? {
            return null
        }

        override fun getParameterNames(): MutableIterator<String> {
            return mutableListOf<String>().iterator()
        }

        override fun getNativeRequest(): Any {
            return ""
        }

        override fun <T : Any?> getNativeRequest(requiredType: Class<T>?): T? {
            return null
        }

        override fun removeAttribute(name: String, scope: Int) {

        }

        override fun getHeader(headerName: String): String? {
            return null
        }

        override fun getContextPath(): String {
            return ""
        }

        override fun checkNotModified(lastModifiedTimestamp: Long): Boolean {
            return false
        }

        override fun checkNotModified(etag: String): Boolean {
            return false
        }

        override fun checkNotModified(etag: String?, lastModifiedTimestamp: Long): Boolean {
            return false
        }

        override fun getHeaderNames(): MutableIterator<String> {
            return mutableListOf<String>().iterator()
        }

        override fun getAttribute(name: String, scope: Int): Any? {
            return null
        }

        override fun setAttribute(name: String, value: Any, scope: Int) {
        }

        override fun isSecure(): Boolean {
            return false
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...