RestTemplate + Jackson
Je veux utiliser le Printemps RestTemplate plus Jackson à consommer un WebService. J'ai suivi plusieurs tutoriels et en sont venus au point de créer les DAOs. C'est la méthode où je reçois tous mes objets de domaine:
//Create a Rest template
RestTemplate restTemplate = new RestTemplate();
//Create a list for the message converters
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
//Add the Jackson Message converter
messageConverters.add(new MappingJacksonHttpMessageConverter());
//Add the message converters to the restTemplate
restTemplate.setMessageConverters(messageConverters);
List<Station> resultList = Arrays.asList(restTemplate.getForObject(BASE_URL, Station[].class));
return resultList;
Mais mon Web Service, ne pas retourner un tableau de la Station des objets immédiatement, mais plutôt une plus sémantique de l'expression de cette façon:
{"success":true,"message":"Records Retrieved Successfully","data":{"totalCount":"14","stations":[{"id":"1264","station":"Station 1","idJefatura":"1","syncDate":"2013-01-24 13:20:43"}, ...] }}
Donc mon problème est que je ne suis pas sûr de la façon de "dire" RestTemplate pour analyser l'objet de la liste de droite après les "stations" de l'indicateur, sans la création d'un groupe ad hoc de l'objet, ce qui ne semble pas être la bonne solution.
Est-il possible de préciser la bonne syntaxe pour RestTemplate?
EDIT: j'ai créé un objet wrapper comme ceci:
public class RestResponseObject {
private boolean success;
private String message;
private Data data;
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public class Data {
private int totalCount;
private List<Station> stations;
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List<Station> getStations() {
return stations;
}
public void setStations(List<Station> estaciones) {
this.stations= estaciones;
}
}
}
Mais j'ai du mal à savoir comment rendre cet objet générique, puisque le nom de la clé de ma liste d'objets dans la réponse JSON est la personne à charge de ce domaine objet de la classe.
OriginalL'auteur MichelReap | 2013-08-20
Vous devez vous connecter pour publier un commentaire.
Il y a deux solutions:
Ici est un exemple.
La réponse de la classe
Dans le Reste Client
Si toutes vos réponses suivent le même format, alors vous pouvez écrire une réponse d'ordre général où MyResponseClass contient une Liste<? s'étend de Données> lorsque des Données est la super classe de la Station. C'est juste une suggestion, je ne suis pas sûr de savoir comment le Printemps va gérer générique de tels cas. Vous avez besoin de l'essayer et de faire modifier votre réponse JSON aussi.
Va le Deserializer route est une meilleure solution, mais alors vous aurez besoin d'écrire deserializer de manière générique, si vous avez besoin pour convertir des réponses qui contiennent des entités autres que des Stations. Si vous êtes seulement en ayant la Gare, puis d'écrire un deserializer.
Je vais avoir un coup d'oeil à tous les deux. Merci.
J'ai essayé les deux solutions, mais j'ai encore des difficultés quant à la façon de rendre le repos à la consommation de génériques. Le problème vient de la syntaxe de mon WS réponses (à laquelle je n'ai pas de contrôle). La liste des stations est précédé par la touche "stations", et le reste de mes objets de domaine sera précédé par une clef similaire avec le nom de l'objet de domaine. Est-il possible de généraliser ws consommation de suivre ce modèle? J'ai posté ma classe Wrapper dans ma question initiale, mais le même problème se pose avec l'aide Personnalisé de la désérialisation (à laquelle je n'ai pas trouvé beaucoup d'exemples, par la voie)
OriginalL'auteur Dhanush Gopinath