我在 ResourceA 中调用 ResourceB。
两者都使用相同的查询参数“param1”。
如何在调用 ResourceB 之前更改 ResourceA 中“param1”的值。
代码如下:
package com.example;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.sun.jersey.api.core.ResourceContext;
public abstract class MyResource {
ResponseBuilder response;
Request request;
protected String param1;
public MyResource(@QueryParam("param1") String param1, @Context Request request) {
this.param1 = param1;
this.request = request;
this.response = Response.ok();
}
}
public class ResourceA extends MyResource {
public ResourceA(String param1, Request request) {
super(param1, request);
}
@Context private ResourceContext rc;
public Response postJSON(String postData) {
JSONObject data = JSONObject.fromObject(postData);
if (data.has("resourceB")) {
ResourceB resourceB = rc.getResource(ResourceB.class);
// resourceB.setQueryParams("param1", "my new param 1");
resourceB.postJSON(data.getJSONArray("resourceB"));
}
}
}
public class ResourceB extends MyResource {
public ResourceB(String param1, Request request) {
super(param1, request);
}
public Response postJSON(JSONArray data) {
// this.params1 should not be "my new param 1"
}
}
最佳答案
如何使用 ResourceContext.initResource(T resource)
,使用修改后的值初始化资源并通过声明 JAX-RS 注释字段来控制 DI 提供程序注入(inject)的内容?
如果我理解你的问题是正确的,你想在找到匹配的资源方法后修改请求上下文,或者 Hook 到注入(inject)中并更改一些值。我不确定这是否可能。
但是,正如我所建议的,如果可以进行一些设计修改,您可以以编程方式初始化资源并利用仅注入(inject)字段:
public Response postJSON(String postData) {
JSONObject data = JSONObject.fromObject(postData);
if (data.has("resourceB")) {
ResourceB resourceB = new ResourceB(/* pass here the modified query param */ "my new param 1");
// let the DI provider inject the JAX-RS annotated fields only
resourceB = rc.initResource(resourceB);
// resourceB.setQueryParams("param1", "my new param 1");
resourceB.postJSON(data.getJSONArray("resourceB"));
}
}
ResourceB
类本身(及其父类(super class))将声明您希望注入(inject)的带注释的字段,而 @QueryParam("param1")
(可能还有其他 JAX-RS 感知字段)将在构造函数中声明,这样它就不会被覆盖。
public abstract class MyResource {
ResponseBuilder response;
// this gets injected in the ResourceContext.initResource() method
@Context
Request request;
// additional JAX-RS annotated fields you would like to have injected such as
@PathParam("id")
private String pathParamId;
protected String param1;
// constructor JAX-RS annotated parameters would not get re-initialized
public MyResource(@QueryParam("param1") String param1) {
this.param1 = param1;
this.request = request;
this.response = Response.ok();
}
}
关于java - Jersey - 修改资源内的查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35150519/