0
String str = commonClient.authorizedRequestBuilder(commonClient.webTarget 
      .path("/apps/get_current_version/default/"+appName+"/"+appName) 
      .queryParam("object_type", "app")) 
      .accept(MediaType.APPLICATION_JSON_TYPE) 
      .get() 
      .readEntity(String.class); 

я получитьJsonMappingException: Не удается найти десериализатор для не конкретного типа карт

str = {"versions": {"ap": "Not Set", "am": "topic-test-publisher-1.0.16", "il": "topic-test-publisher-1.0.16", "row": "topic-test-publisher-1.0.49"}, "provider": "gce"} 

Тогда я изменил к этому коду

Version version = commonClient.authorizedRequestBuilder(commonClient.webTarget 
      .path("/apps/get_current_version/default/"+appName+"/"+appName) 
      .queryParam("object_type", "app")) 
      .accept(MediaType.APPLICATION_JSON_TYPE) 
      .get(ClientResponse.class) 
      .readEntity(new GenericType<Version>(){}); 

и получил исключение:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap, [simple type, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.Object]]] 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) 
    at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:428) 
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:947) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:439) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:296) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) 
    at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:428) 
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:947) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:439) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:296) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) 
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:461) 
    at com.fasterxml.jackson.databind.ObjectReader._findRootDeserializer(ObjectReader.java:1749) 
    at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1465) 
    at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:912) 
    at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:810) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085) 
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874) 
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808) 
    at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:326) 
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:803) 
    ... 32 more 
Caused by: java.lang.IllegalArgumentException: Can not find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap, [simple type, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.Object]]] 
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.createMapDeserializer(BasicDeserializerFactory.java:1158) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:380) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) 
    ... 59 more 

где:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Version { 
    @JsonProperty("am") 
    public String am; 
    @JsonProperty("row") 
    public String row; 

    @Override 
    public String toString() { 
     return "VersionDto{" + 
       "am='" + am + '\'' + 
       ", row='" + row + '\'' + 
       '}'; 
    } 
} 

Как я могу десериализировать его по-другому?

UPDATE

Я пробовал:

с

public class Version { 

    public Map<String, String> versions; 

    public String provider; 

    // getters, setters, etc 
} 

и

Version version = commonClient.authorizedRequestBuilder(commonClient.webTarget 
      .path("/apps/get_current_version/gce/waze-prod/default/"+appName+"/"+appName) 
      .queryParam("object_type", "app")) 
      .accept(MediaType.APPLICATION_JSON_TYPE) 
      .get(ClientResponse.class) 
      .readEntity(Version.class); 

но получил ту же ошибку

+0

связанные: HTTP: // StackOverflow .com/вопросы/35468222/может-не-найти-а-десериализатор-для-не-бетонного-карту типа-карту типа-классового javax-ws –

ответ

2

Я бы сказал, что у объекта Version должно быть поле с именем versions типа Map<String, String>, а другое - provider типа String, и вам, вероятно, не нужна вещь GenericType.

public class Version { 

    private Map<String, String> versions; 

    private String provider; 

    // getters, setters, etc 
} 

затем

Version version = commonClient.authorizedRequestBuilder(commonClient.webTarget) 
      // ... 
      .readEntity(Version.class); 
version.getVersions().get("am"); // to get "am" 

Испытано с

import com.fasterxml.jackson.databind.ObjectMapper; 
import java.io.IOException; 
import java.util.Map; 

public class Test { 
    public static void main(String[] args) throws IOException { 
     String str = "{\"versions\": {\"ap\": \"Not Set\", \"am\": \"topic-test-publisher-1.0.16\", \"il\": \"topic-test-publisher-1.0.16\", \"row\": \"topic-test-publisher-1.0.49\"}, \"provider\": \"gce\"}"; 
     ObjectMapper objectMapper = new ObjectMapper(); 
     Version v = objectMapper.readValue(str, Version.class); 

     System.out.println(v.versions.get("am")); 
    } 

    public static class Version { 
     public Map<String, String> versions; 

     public String provider; 
    } 
} 

выход: "Тема-тест-издатель-1.0.16"

+0

обновите мой q. безуспешно пытался. –

+0

Интересно, работает для меня, хотя я использовал Jackson 1 (org.codehaus.jackson) –

Смежные вопросы