Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey-修改资源内的查询参数_Java_Json_Web Services_Rest_Jersey - Fatal编程技术网

Java Jersey-修改资源内的查询参数

Java Jersey-修改资源内的查询参数,java,json,web-services,rest,jersey,Java,Json,Web Services,Rest,Jersey,我给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; imp

我给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提供者注入的内容
如果我没有弄错您的问题,那么您希望在找到匹配的资源方法后修改请求上下文,或者连接到注入并更改一些值。我不确定这是否可行

但是,正如我所建议的,如果可以进行一些设计修改,您可以通过编程方式初始化资源,并仅利用字段注入:

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
类本身(及其超类)将声明您想要注入的带注释的字段,而
@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();
    }
}

我不知道你想在这里做什么。什么不适用于您的代码?对于param1,ResourceB中的预期值是多少?您可以简单地设置
resourceB.param1=…
,我是否遗漏了什么?是的,这就是我现在正在做的。问题是如果ResourceB调用ResourceC,我需要再次传递参数1。如果我能够更改请求的queryparam的值,我只需要在ResourceA中更改一次。您可以只更改ResourceA的构造函数,这样当它实例化时,该值在单个位置被修改,不应该为ResourceA的每个路径修改,并且在构造函数中,新值还没有被修改知道了,谢谢你的回答。它不是由Jersey提供的开箱即用。。。