2017-09-20 4 views
0

J'ai créé le service Web suivant juste pour apprendre:Jackson Liste <Object> à cordes

@GET 
@Path("/tmp/uno") 
@Produces(MediaType.APPLICATION_JSON) 
public ArrayList<Object> getData() { 
    KeyValue<Integer, Integer> kv = new KeyValue<>(1, 2); 

    List<KeyValue> list = new ArrayList<>(); 
    list.add(kv); 

    **return new ArrayList<Object>(list);** 
} 

que je fais le casting juste pour des fins de test et je reçois l'erreur suivante:

sep 20, 2017 5:53:17 PM org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo 
SEVERE: MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=java.util.ArrayList<java.lang.Object>. 

Si je ne mets pas la liste

@GET 
@Path("/tmp/uno") 
@Produces(MediaType.APPLICATION_JSON) 
public **List<KeyValue>** getData() { 
    KeyValue<Integer, Integer> kv = new KeyValue<>(1, 2); 

    List<KeyValue> list = new ArrayList<>(); 
    list.add(kv); 

    **return list;** 
} 

Je reçois la réponse suivante:

[ 
    { 
     "key": { 
      "type": "int", 
      "value": 1 
     }, 
     "value": { 
      "type": "int", 
      "value": 2 
     } 
    } 
] 

J'ai deux questions 1.- Pourquoi je ne peux pas répondre à une liste d'objets? 2.- Pourquoi chaque propriété a son type de données dans le jSON?


La classe keyValue est la suivante:

public class KeyValue<X, Y> { 
private X key; 
private Y value; 

public KeyValue() { 
    // Auto-generated constructor stub 
} 

public KeyValue(X key, Y value) { 
    this.key = key; 
    this.value = value; 
} 

public X getKey() { 
    return key; 
} 

public Y getValue() { 
    return value; 
} 

public void setKey(X key) { 
    this.key = key; 
} 

public void setValue(Y value) { 
    this.value = value; 
} 
} 

Ma dépendance Jackson est:

<dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <version>2.26</version> 
    </dependency> 

Répondre

0

Essayez d'utiliser la "vraie" bibliothèque Jackson:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.9.1</version> 
</dependency> 

Ou, comme il semble que vous utilisez Jersey, fol faible exemple Mkyong:

https://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/