在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 中资源类构造器参数注入的机制,并在自己的项目中灵活运用。