Bonjour,
Je souhaite appeler des services REST sur GeoServer.
Les appels fonctionnent (retour avec code statut : 200) mais les objets je ne parviens pas à les dé-sérialiser correctement.
J'ai cet objet, dont je voudrais au moins obtenir le name, en le désérialisant.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| @JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value = "workspace")
public class Workspace implements Serializable
{
/** Serial Id. */
private static final long serialVersionUID = -858202108313130391L;
/** Nom du workspace. */
@JsonProperty("name")
private String name;
/** Lien vers le workspace. */
@JsonProperty("href")
private String href;
/**
* Renvoyer le nom du workspace.
* @return Nom du workspace.
*/
public String getName()
{
return this.name;
}
/**
* Fixer le nom du workspace.
* @param name Nom du workspace.
*/
public void setName(String name)
{
this.name = name;
}
/**
* Renvoyer le lien vers le workspace.
* @return Lien vers le workspace.
*/
public String getHref()
{
return this.href;
}
/**
* Fixer le lien vers le workspace.
* @param href Lien vers le workspace.
*/
public void setHref(String href)
{
this.href = href;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return BabelTower.format(Workspace.class, Locales.getDefault(), "toString", this.name, this.href);
}
} |
Voici le test unitaire qui éprouve la désérialisation et montre le problème que je rencontre. Voici le contenu des deux chaînes qui participent au test :
1 2 3 4 5
| geoserver_workspace.json =>
{"workspace":{"name":"topp","dataStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/datastores.json","coverageStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/coveragestores.json","wmsStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/wmsstores.json"}}
et geoserver_workspace_alternative.json =>
{"name":"topp","dataStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/datastores.json","coverageStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/coveragestores.json","wmsStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/wmsstores.json"} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| @Test
public void workspace_mapper() throws JsonGenerationException, JsonMappingException, IOException
{
// Sérialisation : pour voir la manière dont jackson sérialiserait lui-même l'objet si on le lui demandait.
Workspace w1 = new Workspace();
w1.setName("essai");
w1.setHref("Lien vers url essai");
StringWriter swtr = new StringWriter();
ObjectMapper mapper = new ObjectMapper();
mapper.writerWithDefaultPrettyPrinter().writeValue(swtr, w1);
log.info("La séralisation de w1 donne en JSON {}", swtr.toString());
// Désérialisation avec la chaîne JSON que renvoie geoserver.
File fileW2 = new File(getClass().getClassLoader().getResource("geoserver_workspace.json").getFile());
Workspace w2 = mapper.readValue(fileW2, Workspace.class);
log.info("La désérialisation du workspace w2 depuis la chaîne sortie de geoserver donne : {}", w2);
// Désérialisation avec la chaîne JSON pour laquelle notre test serait satisfait.
File fileW3 = new File(getClass().getClassLoader().getResource("geoserver_workspace_alternative.json").getFile());
Workspace w3 = mapper.readValue(fileW3, Workspace.class);
log.info("La désérialisation du workspace w3 depuis la chaîne que jackson aurait préféré donne : {}", w3);
assertNotNull("Le workspace n'a pas été extrait de la chaine w3", w3);
assertNotNull("Le workspace de la chaîne w3 n'a pas de nom", w3.getName());
assertNotNull("Le workspace n'a pas été extrait de la chaîne w2", w2);
assertNotNull("Le workspace de la chaîne n'a pas de nom w2", w2.getName());
} |
Voici les logs d'étape du déroulé de ce test :
La séralisation de w1 donne en JSON {
"name" : "essai",
"href" : "Lien vers url essai"
}
La désérialisation du workspace w2 depuis la chaîne sortie de geoserver donne : {nom : null, lien : null}
La désérialisation du workspace w3 depuis la chaîne que jackson aurait préféré donne : {nom : topp, lien : null}
Quel paramétrage dois-je faire pour que Jackson désérialise correctement la chaîne qui vient de geoserver, et qui est celle-ci ?
{"workspace":{"name":"topp","dataStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/datastores.json","coverageStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/coveragestores.json","wmsStores":"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/wmsstores.json"}}
Le @JsonRootName(value = "workspace") que j'ai mis sur mon objet est une expérience parmi tant d'autres que j'ai faites, mais qui n'aboutit pas.
Parfois, je me demande si Jackson examine seulement les annotations que j'ai mises sur mon objet.
Merci !
Partager