You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在RESTEasy中实现自定义参数注解(如@Pageable)?

在RESTEasy中实现自定义@Pageable参数注入

要在RESTEasy中实现你想要的@Pageable参数注入逻辑,核心是自定义ValueInjector并通过扩展InjectorFactory来注册它,具体步骤如下:

1. 定义@Pageable注解(如果尚未定义)

如果还没自定义这个注解,先补全它的定义:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pageable {
    int minSize() default 1;
    int maxSize() default 100;
}

2. 实现自定义ValueInjector

创建一个实现ValueInjector的类,负责解析请求参数、生成Pageable实例,并应用注解里的minSize和maxSize限制:

import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.ValueInjector;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import java.lang.reflect.Type;

public class PageableInjector implements ValueInjector {

    private final int minSize;
    private final int maxSize;

    public PageableInjector(Pageable pageableAnnotation) {
        this.minSize = pageableAnnotation.minSize();
        this.maxSize = pageableAnnotation.maxSize();
    }

    @Override
    public Object inject(HttpRequest request, boolean unwrapAsync) {
        // 解析请求中的分页参数,比如page、size
        String pageParam = request.getUri().getQueryParameters().getFirst("page");
        String sizeParam = request.getUri().getQueryParameters().getFirst("size");

        int page = pageParam != null ? Integer.parseInt(pageParam) : 0;
        int size = sizeParam != null ? Integer.parseInt(sizeParam) : minSize;

        // 应用大小限制
        size = Math.max(minSize, Math.min(size, maxSize));

        // 返回你的Pageable实例(这里假设是Spring Data的Pageable,或自定义实现)
        return org.springframework.data.domain.PageRequest.of(page, size);
    }

    @Override
    public Object inject(HttpRequest request) {
        return inject(request, false);
    }

    @Override
    public Type getType() {
        return org.springframework.data.domain.Pageable.class;
    }
}

3. 扩展InjectorFactory注册自定义Injector

因为默认的InjectorFactoryImpl无法直接修改,我们需要继承它并覆盖参数注入器的获取逻辑,当检测到@Pageable注解时返回自定义Injector:

import org.jboss.resteasy.core.InjectorFactoryImpl;
import org.jboss.resteasy.spi.ValueInjector;

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

public class CustomInjectorFactory extends InjectorFactoryImpl {

    @Override
    public ValueInjector createParameterExtractor(Class<?> type, Type genericType, Annotation[] annotations, String paramName) {
        // 遍历参数注解,查找@Pageable
        for (Annotation annotation : annotations) {
            if (annotation instanceof Pageable) {
                return new PageableInjector((Pageable) annotation);
            }
        }
        // 其他情况使用默认实现
        return super.createParameterExtractor(type, genericType, annotations, paramName);
    }
}

4. 注册自定义InjectorFactory

根据你的部署方式,将自定义的InjectorFactory注册到RESTEasy中:

方式1:传统WAR部署(web.xml配置)

在web.xml中添加RESTEasy配置参数:

<context-param>
    <param-name>resteasy.injector.factory</param-name>
    <param-value>com.yourpackage.CustomInjectorFactory</param-value>
</context-param>

方式2:Spring Boot环境

通过配置类注册自定义Factory:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RestEasyConfig {

    @Bean
    public org.jboss.resteasy.spi.InjectorFactory customInjectorFactory() {
        return new CustomInjectorFactory();
    }
}

完成以上步骤后,你就可以像示例中那样使用@Pageable注解注入参数了:

@Path("/test")
@GET 
public Response get(@Pageable(minSize = 5, maxSize = 10) Pageable pageable) {
    // 处理分页逻辑
    return Response.ok().build();
}

内容的提问来源于stack exchange,提问作者bramh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:15:45