Джерси не отображает ответ на объект JAVA

#java #web-services #jersey #pojo #wildfly-10

#java #веб-сервисы #джерси #pojo #wildfly-10

Вопрос:

Я пытаюсь использовать ответ API часового пояса Google. Я перепробовал все ответы на переполнение стека, связанные с этой ошибкой, но приведенная ниже ошибка даже немного не изменилась:

 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   '''  
            '}';
}
}
  

Ниже приведен метод получения клиента Джерси:

 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 amp;amp; !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);

}
  

У меня есть зависимости от jersey-server jersey-bundle jersey-json in pom .

Ответ №1:

Точно так же, как вы настраиваете POJOMappingFeature на сервере, вам также необходимо настроить его на клиенте

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

Прошло некоторое время с тех пор, как я использовал Джерси 1, поэтому, если вышеуказанное не работает, используйте config.getProperties() , но я думаю, что так и должно быть getFeatures .

Комментарии:

1. У меня <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> в моем web.xml нужно ли мне делать это снова?

2. Это нужно для клиента, который я показал выше. Ошибка, с которой вы столкнулись, — это ошибка клиента

3. Вы имеете в виду, что Google Api нуждается в этом?

4. Нет, я имею в виду Джерси Client

5. Вау, я добавил это, и это работает как шарм 🙂 Большое вам спасибо 🙂