gpt4 book ai didi

java - 在 Webflux 中解决 Pageable

转载 作者:行者123 更新时间:2023-12-02 12:28:08 27 4
gpt4 key购买 nike

我花了很多时间在 Webflux 中找到有关 Pageable 的解决方案,不幸的是,在撰写本文时,Webflux 不支持 Pageable 所以我想出了一个解决方案,这就是我已经实现的。这是解决 Spring Boot 中 Webflux Controller /资源中的 Pageable 和 Sort 类型的一种hacky 解决方案。

这是解决方案:(我知道它可能很丑,但您可以使用它直到 Spring 团队解决问题为止,我们正在为此努力。Spring Jira

此外,要点在这里:Github

更新1:您可以找到文章here in medium还有

版本:

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
}
}

}

最佳答案

ReactivePageableHandlerMethodArgumentResolver类(class)
示例与 WebFluxConfigure :

@Configuration
@ConditionalOnClass(EnableWebFlux.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class WebfluxConfig implements WebFluxConfigurer {
@Override
public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
configurer.addCustomResolver(new ReactivePageableHandlerMethodArgumentResolver());
}
}

关于java - 在 Webflux 中解决 Pageable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50730446/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com