【问题标题】:Jersey not mapping response to JAVA Object泽西岛没有将响应映射到 JAVA 对象
【发布时间】:2016-10-12 09:49:22
【问题描述】:

我正在尝试使用 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

下面是我的 JAVA 类:

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 Client 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 的依赖项。

【问题讨论】:

    标签: java web-services jersey pojo wildfly-10


    【解决方案1】:

    就像你在服务端配置POJOMappingFeature一样,你也需要在客户端配置它

    ClientConfig config = new DefaultClientConfig();
    config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
    Client client = Client.create(config);
    

    我用 Jersey 1 已经有一段时间了,所以如果上面不起作用,那么使用config.getProperties(),但我认为应该是getFeatures

    【讨论】:

    • 我的 web.xml 中有 &lt;init-param&gt; &lt;param-name&gt;com.sun.jersey.api.json.POJOMappingFeature&lt;/param-name&gt; &lt;param-value&gt;true&lt;/param-value&gt; &lt;/init-param&gt;,我需要再做一次吗?
    • 客户端需要它,我在上面展示过。您面临的错误是客户端错误
    • 你的意思是 Google Api 需要这个?
    • 不,我是说球衣Client
    • 哇,我添加了这个,它就像一个魅力:) 非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多