泽西流利 API 烦恼
Jersey fluent API troubles
我正在重写一些代码,因为我必须升级到最新版本的 Jersey (2.18),我不明白为什么 fluent API 会这样工作。
为什么编译:
Response.Status.Family responseFamily = webTarget
.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(entity, MediaType.APPLICATION_JSON_TYPE))
.getStatusInfo()
.getFamily();
但事实并非如此:
Response response = webTarget
.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(entity, MediaType.APPLICATION_JSON_TYPE));
response.getStatusInfo().getFamily(); // the method getStatusInfo() isn't available here; why not?
作为参考,这是我的整个方法,它过去在 Jersey 2.5.1 中运行良好,但由于 getStatusInfo() 方法甚至无法在 2.18 中编译:
public void postGenericJson(Object entity, String... pathSegments) {
Response response;
WebTarget webTarget = httpsClient.target(apiBaseUrl);
try {
for (String pathSegment : pathSegments) {
webTarget = webTarget.path(pathSegment);
}
response = webTarget.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(entity, MediaType.APPLICATION_JSON_TYPE));
log.trace("Issued POST to '" + webTarget.getUri().toString() + "'.");
} catch (Exception e) {
log.error("Error posting DTO: POST " + webTarget.getUri().toString(), e);
throw new RuntimeException("Error posting DTO.");
}
if (response.getStatusInfo().getFamily() != Response.Status.Family.SUCCESSFUL) {
throw new ResponseProcessingException(response, "Error POSTing DTO");
}
}
正如我在球衣 API 中发现的那样,returns 状态信息不是响应,而应该是 Response.StatusType
,这同样适用于 getFamily。
查看球衣 api,请求搜索 Response.class
https://jersey.java.net/apidocs/latest/jersey/index.html
原来是 Maven 问题。我对 jersey-server 和 jersey-client 都有自己的依赖,都是 2.18 版,但另一个依赖对 jersey-1.9.1 有自己的依赖。我以为我已经排除了它们,但无论如何它们都在我的图书馆列表中。我终于意识到我在排除中使用了错误的包名。我将排除的 groupId 从 org.glassfish.jersey.core
更改为 com.sun.jersey
,现在我的代码可以编译。
我正在重写一些代码,因为我必须升级到最新版本的 Jersey (2.18),我不明白为什么 fluent API 会这样工作。
为什么编译:
Response.Status.Family responseFamily = webTarget
.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(entity, MediaType.APPLICATION_JSON_TYPE))
.getStatusInfo()
.getFamily();
但事实并非如此:
Response response = webTarget
.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(entity, MediaType.APPLICATION_JSON_TYPE));
response.getStatusInfo().getFamily(); // the method getStatusInfo() isn't available here; why not?
作为参考,这是我的整个方法,它过去在 Jersey 2.5.1 中运行良好,但由于 getStatusInfo() 方法甚至无法在 2.18 中编译:
public void postGenericJson(Object entity, String... pathSegments) {
Response response;
WebTarget webTarget = httpsClient.target(apiBaseUrl);
try {
for (String pathSegment : pathSegments) {
webTarget = webTarget.path(pathSegment);
}
response = webTarget.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(entity, MediaType.APPLICATION_JSON_TYPE));
log.trace("Issued POST to '" + webTarget.getUri().toString() + "'.");
} catch (Exception e) {
log.error("Error posting DTO: POST " + webTarget.getUri().toString(), e);
throw new RuntimeException("Error posting DTO.");
}
if (response.getStatusInfo().getFamily() != Response.Status.Family.SUCCESSFUL) {
throw new ResponseProcessingException(response, "Error POSTing DTO");
}
}
正如我在球衣 API 中发现的那样,returns 状态信息不是响应,而应该是 Response.StatusType
,这同样适用于 getFamily。
查看球衣 api,请求搜索 Response.class https://jersey.java.net/apidocs/latest/jersey/index.html
原来是 Maven 问题。我对 jersey-server 和 jersey-client 都有自己的依赖,都是 2.18 版,但另一个依赖对 jersey-1.9.1 有自己的依赖。我以为我已经排除了它们,但无论如何它们都在我的图书馆列表中。我终于意识到我在排除中使用了错误的包名。我将排除的 groupId 从 org.glassfish.jersey.core
更改为 com.sun.jersey
,现在我的代码可以编译。