2010-01-10 5 views
1

J'ai quelques POJO qui sont à la base de cette API RESTful sur laquelle je travaille. Cependant, certaines des réponses que j'ai besoin d'inclure d'autres informations pour rendre l'API plus complète. Je ne veux vraiment pas mettre ces informations supplémentaires dans le POJO, mais l'inclure dans la couche du service Web comme si c'était le cas.MarshallingView au printemps pour ajuster la sortie?

Il traite des « gens » qui ont « rendez-vous ». Chaque rendez-vous n'a qu'une seule personne. Donc, j'ai un appel RESTful comme/Patients/1 et il saisit fondamentalement le POJO pour la personne et j'utilise actuellement XStream pour le sérialiser et l'envoyer sur son chemin. Cela fonctionne très bien, mais je voudrais faire quelque chose comme ceci:

<Person> 
<firstName>James</firstName> 
... other fields ... 
<nextAppointment href="/Appointment/12345>2010-02-19</nextAppointment> 
<prevAppointment href="/Appointment/12346>2010-01-01</prevAppointemnt> 
</Person> 

et la nomination prochaine où prev ne sont pas réellement inclus dans la personne POJO. Je suis à la recherche d'un bon "chemin du printemps" pour y parvenir. Le client pourrait faire quelque chose comme ça/patients/1/PreviousAppointment et/patients/1/NextAppointment, mais je cherche à réduire le nombre d'appels (pré-optimisation peut-être?) Et leur donner un moyen d'obtenir plus d'informations si elles ont besoin en utilisant il href.

Il est très élégant en utilisant la XStreamMarshaller depuis tout ce que je le fais la main, l'vue POJO ou liste des POJO et il gère. Mais j'ai besoin de les faire soigner un peu avant qu'ils ne soient envoyés.

Merci!

Répondre

1

Ceci est le problème avec la remise de vos objets métier directement au placier - vous avez très peu de flexibilité dans la façon dont ils se tournent cet objet dans la réponse. Il y a quelque chose à dire pour pré-transformer les objets vous-même, vous obtenez plus de contrôle de cette façon.

Donc, si vous avez une structure de sortie spécifique que vous voulez, puis avec XStream vous devez construire une structure de classe qui ressemble. Vous transformez ensuite vos objets métier en cette structure de classe, et passez cette valeur à XStream à la place.

Cela peut sembler moins élégant, mais votre système sera beaucoup moins susceptible d'être brisé par de petits changements dans votre modèle d'objet métier, ce qui sera votre système XStream actuel.

+1

Cela a du sens.Donc, je pense que j'ai essentiellement deux options, soit générer le XML moi-même en utilisant les différents objets de gestion que j'ai, ou créer un nouvel objet qui représente le format de sortie que je veux avoir et utiliser XStream sur cela. Le problème avec les nouveaux objets est qu'il nécessitera un tas de code de colle et une duplication de la plupart des champs des objets POJO réels. Je pense maintenant à laisser le client rassembler les informations supplémentaires via des appels d'API supplémentaires jusqu'à ce qu'il soit prouvé que les performances sont inacceptables. –

1

solution à votre problème: créer un CUSTOMIZEDCONVERTER ...

CustomizedConverter public class implémente Converter {

@Override maréchal public void (Object source, écrivain HierarchicalStreamWriter, contexte MarshallingContext) {.... }

@Override objet unmarshal public (lecteur HierarchicalStreamReader, contexte UnmarshallingContext) {..}

@Override CanConvert public boolean (classe clazz) {..}

}

Pour savoir quoi utiliser le convertisseur avec le Marshaller se référer this.

Donc, fondamentalement, le CONVERTISSEUR travaille sur les POJO et assure que nous obtenons la réponse XML comme indiqué dans le contrat.