Jersey 2 - 在客户

时间:2016-08-21 19:28:00

标签: java jersey-2.0 jersey-client

我需要将UriInfo注入客户端,但无法找到解决方法。 主要目标是在创建WebTarget时获取基URI(localhost:port)。事实是,应用程序由不同的Web客户端使用,并且需要显式URI。更多的是我想测试客户端资源通信,因此我需要在我的测试类中获得严格的URI。 应用程序是多模块Maven项目。资源和客户端位于不同的模块中。
为了清楚起见我在下面描述了项目结构(请不要注意文件夹结构 - 它以简单的形式描述):

--service-module
       \Resource.java
       \web.xml
--client-module
       \Client.java
--client-test-module
       \ClientResourceIntegrationTest.java

Client.java

public class Client {

    @Context
    UriInfo uriInfo;

    public Result getResult(String userName, Filter queryFilter) {
        ClientConfig clientConfig = new ClientConfig();
        clientConfig.register(Filter.class);
        Client client = ClientBuilder.newClient(clientConfig);

        WebTarget webTarget = client
                //need to change on dynamically retrieved URI
                .target("http://localhost:1234/")
                .path("all/")
                .path(userName);

        Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
        Response response = invocationBuilder.post(Entity.entity(queryFilter, MediaType.APPLICATION_JSON));
        int responseStatus = response.getStatus();
        Result queryResult = response.readEntity(Result.class);
        response.close();
        return queryResult;
    }

}

Resource.java

@Path("/")
public class Resource {

    @Context
    UriInfo uriInfo;

    @POST
    @Path("all/{user}")
    @Produces(MediaType.APPLICATION_JSON)
    public Result getAll(@PathParam("user") String userName, Filter filter) {
        List<Map<String, Object>> attributes = new ArrayList<Map<String, Object>>();
        Map<String, Object> values = new HashMap<String, Object>();
        values.put("value", 1);
        attributes.add(values);

        Result result = new Result(attributes);
        return result;
    }

}

泽西岛的ServletContainer在web.xml中定义,位于service-module。扫描的pakages只是位于此模块中的资源(因此UriInfo被注入到Resource对象中)。其余类(包括客户端)的实例是在没有IoC容器的情况下创建的(显然UriInfo为空)。所以,在这种情况下,我不知道如何获取URI。如果您有任何建议在哪里阅读或甚至如何做 - 请发表评论。

1 个答案:

答案 0 :(得分:1)

我不确定我理解你的问题。部署Web应用程序时,可以在EAR文件中定义上下文根。如果您在不同的应用程序服务器上安装相同的EAR,则该上下文根将不会更改,除非部署者配置不同的上下文根。

客户端可能会在不同的计算机上运行,​​因此您需要找到一种方法来配置客户端以及查找服务器的位置信息。这通常由数据库中的属性文件或配置表完成。只需为所有合适的环境设置配置文件,然后将其提供给客户端。