深入解析JAX-RS资源类构造器参数注入

在JAX-RS中,资源类构造器的参数注入是一个强大而灵活的特性,它允许开发者在资源类初始化时注入请求相关的上下文信息。本文将通过一个具体的实例,深入解析这一机制的工作原理和使用方式。

构造器参数注入机制

在JAX-RS中,资源类的构造器可以包含以下注解参数:@Context, @HeaderParam, @CookieParam, @MatrixParam, @QueryParam@PathParam。JAX-RS 运行时将自动注入这些参数的值,就像它为资源方法参数所做的那样。

实例演示

让我们通过一个简单的例子来理解这一机制:

@Path("/")
public class MyResource {
    private final UriInfo uriInfo;
    private String qValue;
    private int pathNum;

    public MyResource(@Context UriInfo uriInfo, 
                       @PathParam("num") int pathNum, 
                       @QueryParam("q") String qValue) {
        this.pathNum = pathNum;
        this.uriInfo = uriInfo;
        this.qValue = qValue;
    }

    @Path("/test{num:[1-9]{0,1}}")
    public String handleRequest() {
        URI uri = uriInfo.getRequestUri();
        return String.format("response from: %s\nPathNum: %s\nq: %s\n",
                uri, pathNum, qValue);
    }
}

在这个例子中,MyResource 类的构造器接收了三个参数,分别通过 @Context, @PathParam@QueryParam 注解来注入。

测试实例

为了测试上述资源,可以在 pom.xml 中配置嵌入式 Tomcat 并使用以下 Maven 命令启动:

mvn tomcat7:run

接下来,编写一个 JAX-RS 客户端来测试资源:

public class MyClient {
    public static void main(String[] args) {
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://localhost:8080/test9");
        String response = target.queryParam("q", "testVal")
                                  .request()
                                  .get(String.class);
        System.out.println(response);
    }
}

执行客户端代码后,输出结果如下:

response from: http://localhost:8080/test9?q=testVal  
PathNum: 9  
q: testVal  

单例资源类与构造器参数

需要注意的是,对于单例资源类,构造器中包含请求时信息可能没有意义。此外,在 Application 子类中,也无法在构造时传递请求时参数:

@ApplicationPath("/")
public class MyRestApp extends Application {
    // ...

    public Set<Object> getSingletons() {
        Set<Object> set = new HashSet<>();
        // set.add(new MyResource()); // 无法在这里传递请求时参数
        return set;
    }
    // ...
}

使用多个构造器

可以定义多个具有不同可接受参数的公共构造器。运行时实现将使用匹配参数最多的那个构造器。如果有多个构造器具有相同数量的参数,那么选择哪一个由 JAX-RS 实现决定。根据规范,实现应该对这种歧义生成警告。

示例项目

使用的依赖和技术:

  • jersey-container-servlet 2.25.1: Jersey 核心 Servlet 3.x 实现。
  • JDK 1.8
  • Maven 3.3.9

通过本文的深入解析和实例演示,希望读者能够更好地理解 JAX-RS 中资源类构造器参数注入的机制,并在自己的项目中灵活运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

t0_54coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值