Jersey 没有将响应映射到 JAVA 对象
Jersey not mapping response to JAVA Object
我正在尝试使用 Google 时区 API 响应。我已经尝试了 Stack Overflow 上与此错误相关的所有答案,但以下错误甚至没有一点改变:
ERROR [ClientResponse]:625 - A message body reader for Java class com.bystored.business.bo.timezone.TimeZoneResponse, and Java type class com.bystored.business.bo.timezone.TimeZoneResponse, and MIME media type application/json; charset=UTF-8 was not found
2016-10-12 14:39:36 ERROR [ClientResponse]:627 - The registered message body readers compatible with the MIME media type are:
application/json; charset=UTF-8 ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy
下面是我的JAVAclass:
public class TimeZoneResponse implements Serializable {
private long dstOffset;
private long rawOffset;
private String status;
private String timeZoneId;
private String timeZoneName;
@JsonProperty("dstOffset")
public long getDstOffset() {
return dstOffset;
}
public void setDstOffset(long dstOffset) {
this.dstOffset = dstOffset;
}
@JsonProperty("rawOffset")
public long getRawOffset() {
return rawOffset;
}
public void setRawOffset(long rawOffset) {
this.rawOffset = rawOffset;
}
@JsonProperty("status")
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@JsonProperty("timeZoneId")
public String getTimeZoneId() {
return timeZoneId;
}
public void setTimeZoneId(String timeZoneId) {
this.timeZoneId = timeZoneId;
}
@JsonProperty("timeZoneName")
public String getTimeZoneName() {
return timeZoneName;
}
public void setTimeZoneName(String timeZoneName) {
this.timeZoneName = timeZoneName;
}
@Override
public String toString() {
return "TimeZoneResponse{" +
"dstOffset=" + dstOffset +
", rawOffset=" + rawOffset +
", status='" + status + '\'' +
", timeZoneId='" + timeZoneId + '\'' +
", timeZoneName='" + timeZoneName + '\'' +
'}';
}
}
Jersey 客户端 GET 方法如下:
public static <T extends Object> T get (String url, Map<String, String> queryParams, Map<String, String> headers, Class<? extends T> type) {
Client client = Client.create();
WebResource webResource = client.resource(url);
if (queryParams != null) {
for (String key : queryParams.keySet()) {
webResource = webResource.queryParam(key, queryParams.get(key));
}
}
WebResource.Builder builder = webResource.getRequestBuilder();
if(headers != null && !headers.isEmpty()) {
for(Map.Entry<String, String> entry : headers.entrySet()) {
builder = webResource.header(entry.getKey(), entry.getValue());
}
}
return builder.accept(MediaType.APPLICATION_JSON).get(type);
}
我在 pom
.
中有 jersey-server
jersey-bundle
jersey-json
的依赖项
就像你在服务器上配置POJOMappingFeature
一样,你也需要在客户端配置它
ClientConfig config = new DefaultClientConfig();
config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
Client client = Client.create(config);
好久没用Jersey 1了,如果上面不行就用config.getProperties()
,不过我觉得应该是getFeatures
.
我正在尝试使用 Google 时区 API 响应。我已经尝试了 Stack Overflow 上与此错误相关的所有答案,但以下错误甚至没有一点改变:
ERROR [ClientResponse]:625 - A message body reader for Java class com.bystored.business.bo.timezone.TimeZoneResponse, and Java type class com.bystored.business.bo.timezone.TimeZoneResponse, and MIME media type application/json; charset=UTF-8 was not found
2016-10-12 14:39:36 ERROR [ClientResponse]:627 - The registered message body readers compatible with the MIME media type are:
application/json; charset=UTF-8 ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy
下面是我的JAVAclass:
public class TimeZoneResponse implements Serializable {
private long dstOffset;
private long rawOffset;
private String status;
private String timeZoneId;
private String timeZoneName;
@JsonProperty("dstOffset")
public long getDstOffset() {
return dstOffset;
}
public void setDstOffset(long dstOffset) {
this.dstOffset = dstOffset;
}
@JsonProperty("rawOffset")
public long getRawOffset() {
return rawOffset;
}
public void setRawOffset(long rawOffset) {
this.rawOffset = rawOffset;
}
@JsonProperty("status")
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@JsonProperty("timeZoneId")
public String getTimeZoneId() {
return timeZoneId;
}
public void setTimeZoneId(String timeZoneId) {
this.timeZoneId = timeZoneId;
}
@JsonProperty("timeZoneName")
public String getTimeZoneName() {
return timeZoneName;
}
public void setTimeZoneName(String timeZoneName) {
this.timeZoneName = timeZoneName;
}
@Override
public String toString() {
return "TimeZoneResponse{" +
"dstOffset=" + dstOffset +
", rawOffset=" + rawOffset +
", status='" + status + '\'' +
", timeZoneId='" + timeZoneId + '\'' +
", timeZoneName='" + timeZoneName + '\'' +
'}';
}
}
Jersey 客户端 GET 方法如下:
public static <T extends Object> T get (String url, Map<String, String> queryParams, Map<String, String> headers, Class<? extends T> type) {
Client client = Client.create();
WebResource webResource = client.resource(url);
if (queryParams != null) {
for (String key : queryParams.keySet()) {
webResource = webResource.queryParam(key, queryParams.get(key));
}
}
WebResource.Builder builder = webResource.getRequestBuilder();
if(headers != null && !headers.isEmpty()) {
for(Map.Entry<String, String> entry : headers.entrySet()) {
builder = webResource.header(entry.getKey(), entry.getValue());
}
}
return builder.accept(MediaType.APPLICATION_JSON).get(type);
}
我在 pom
.
jersey-server
jersey-bundle
jersey-json
的依赖项
就像你在服务器上配置POJOMappingFeature
一样,你也需要在客户端配置它
ClientConfig config = new DefaultClientConfig();
config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
Client client = Client.create(config);
好久没用Jersey 1了,如果上面不行就用config.getProperties()
,不过我觉得应该是getFeatures
.