我需要将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。如果您有任何建议在哪里阅读或甚至如何做 - 请发表评论。
答案 0 :(得分:1)
我不确定我理解你的问题。部署Web应用程序时,可以在EAR文件中定义上下文根。如果您在不同的应用程序服务器上安装相同的EAR,则该上下文根将不会更改,除非部署者配置不同的上下文根。
客户端可能会在不同的计算机上运行,因此您需要找到一种方法来配置客户端以及查找服务器的位置信息。这通常由数据库中的属性文件或配置表完成。只需为所有合适的环境设置配置文件,然后将其提供给客户端。