Comment faire pour convertir un objet Java (haricot) de paires clé-valeur (et vice versa)?
Dire que j'ai un très simple objet java qui n'a que quelques getXXX et setXXX propriétés. Cet objet est utilisé seulement pour traiter les valeurs, fondamentalement, un enregistrement ou un type-safe (et performant) de la carte. J'ai souvent besoin de convertir cet objet de paires clé-valeur (forme de chaînes ou de type sécurisé) ou de convertir à partir de paires clé-valeur à cet objet.
Autres que la réflexion, ou manuellement à l'écriture de code pour faire cette conversion, quelle est la meilleure façon d'atteindre cet objectif?
Un exemple pourrait être l'envoi de cet objet plus jms, sans l'aide de la ObjectMessage type (ou la conversion d'un message entrant le bon type de l'objet).
Vous devez vous connecter pour publier un commentaire.
Il y a toujours apache communes beanutils mais bien sûr, il utilise la réflexion sous le capot
java.beans
dépendances sévèrement limité sur la plate-forme. Voir le question connexe pour plus de détails.Beaucoup de solutions possibles, mais nous allons juste ajouter un de plus. Utilisation Jackson (JSON traitement lib) pour faire "json moins" de la conversion, comme:
(cette entrée de blog a quelques exemples de plus)
Vous pouvez pratiquement convertir tout types compatibles: compatible, ce qui signifie que si vous n'avez convertir de type JSON, et à partir de ce JSON à type de résultat, d'entrées match (si configuré correctement peut également ignorer ceux non reconnus).
Fonctionne bien pour les cas on pourrait s'attendre, y compris des Cartes, des Listes, des tableaux, des primitives, proche du haricot Pojo.
BeanUtils
est agréable, mais ne peut pas gérer les tableaux et les énumérationsDe génération de Code serait le seul moyen d'autres je pense. Personnellement, j'avais obtenu avec un généralement réutilisables réflexion solution (à moins que cette partie du code est absolument la performance est critique). À l'aide de JMS sonne comme overkill (en plus de la dépendance, et c'est même pas ce que cela signifiait pour). En outre, il utilise probablement une réflexion aussi bien sous le capot.
C'est une méthode de conversion d'un objet Java à une Carte
C'est la façon de l'appeler
Avec Java 8, vous pouvez essayer ceci :
JSON, par exemple à l'aide de XStream + Larguer, est un format de texte simple avec des paires clé-valeur. Elle est soutenue par exemple par l'Apache ActiveMQ JMS courtier de message pour objet Java échange avec d'autres plates-formes /langages.
Simplement à l'aide de la réflexion et Groovy :
Utilisation juffrou réfléchir's BeanWrapper. Il est très performant.
Voici comment vous pouvez transformer une fève dans une carte:
J'ai développé Juffrou moi-même. Il est open source, donc vous êtes libre de l'utiliser et le modifier. Et si vous avez des questions à ce sujet, je serai heureux d'y répondre.
Acclamations
Carlos
Lors de l'utilisation de Printemps, on peut aussi utiliser le Printemps de l'Intégration de l'objet-pour-carte-transformateur. Ce n'est probablement pas utile d'ajouter de Printemps comme une dépendance pour cette seule raison.
Pour la documentation, de la recherche pour "Object-to-Carte Transformateur" sur http://docs.spring.io/spring-integration/docs/4.0.4.RELEASE/reference/html/messaging-transformation-chapter.html
Essentiellement, il traverse l'ensemble de l'objet graphique accessible à partir de l'objet donné en entrée, et produit une carte de tous type primitif/les champs de type Chaîne sur les objets. Il peut être configuré pour une sortie:
Voici un exemple à partir de leur page:
Sortie sera:
Inverse transformateur est également disponible.
Vous pouvez utiliser le Joda cadre:
http://joda.sourceforge.net/
et profiter de JodaProperties. Cela ne stipulent que vous créez des haricots, de façon particulière, cependant, et de mettre en œuvre une interface spécifique. Il ne puis, cependant, vous permettent de retourner une carte de propriété d'une classe spécifique, sans réflexion. Exemple de code est ici:
http://pbin.oogly.co.uk/listings/viewlistingdetail/0e78eb6c76d071b4e22bbcac748c57
Si vous ne souhaitez pas coder en dur les appels à chaque getter et setter, la réflexion est le seul moyen pour appeler ces méthodes, mais il n'est pas difficile).
Pouvez-vous refactoriser la classe en question d'utiliser un objet de Propriétés pour contenir les données réelles, et de laisser chaque getter et setter suffit d'appeler get/set sur elle? Ensuite, vous avez une structure bien adaptée pour ce que vous voulez faire. Il en est de même des méthodes pour enregistrer et charger dans la clé-valeur.
La meilleure solution est d'utiliser des Bulldozers. Vous avez juste besoin quelque chose comme ceci dans le fichier mappeur:
Et c'est ça, des Bulldozers s'occupe du reste!!!
Dozer URL de Documentation
Il y a bien sûr l'absolu moyen le plus simple de conversion possible - pas de conversion à tous!
au lieu d'utiliser des variables privées définies dans la classe, faire la classe ne contient qu'une table de hachage qui stocke les valeurs de l'instance.
Alors votre getters et les setters de retour et de définir des valeurs dans et hors de la table de hachage, et quand il est temps de le convertir à une carte, le tour est joué! - c'est déjà une carte.
Avec un peu de l'AOP magie, vous risquez même de maintenir la rigidité inhérente à un haricot en vous permettant de continuer à utiliser les accesseurs et mutateurs spécifiques à chacune des valeurs de nom, sans avoir à écrire la personne getters et setters.
Vous pouvez utiliser le java 8 flux de filtre de collecteur de propriétés,
Probablement à la fin de la partie. Vous pouvez utiliser Jackson et de le convertir en un objet de Propriétés. Ceci est adapté pour les classes Imbriquées et si vous voulez la clé dans la pour un.b.c=valeur.
si vous voulez un peu de suffixe, puis il suffit de faire
il faut ajouter à cette dépendance
Mon JavaDude Bean Processeur d'Annotation génère du code pour ce faire.
http://javadude.googlecode.com
Par exemple:
Ci-dessus génère de la superclasse PersonGen qui comprend un createPropertyMap() méthode qui génère une Carte pour toutes les propriétés définies à l'aide de @Bean.
(Notez que je vais changer l'API légèrement pour la prochaine version -- l'annotation de l'attribut sera defineCreatePropertyMap=true)
Vous devriez écrire un générique Service de transformation! Utiliser des génériques pour le garder de type libre (donc vous pouvez convertir tous les objets de la clé=>valeur et à l'arrière).
Ce champ doit être la clé? Obtenir que le champ de la fève et ajouter les autres non transitoire valeur dans une carte de valeur.
Le chemin du retour est assez facile. Touche de lecture(x) et écrire d'abord sur la touche, puis chaque entrée de la liste de retour pour un nouvel objet.
Vous pouvez obtenir les noms des propriétés d'un bean avec la apache commons beanutils!
Si vraiment vous voulez vraiment de la performance, vous pouvez aller à la génération de code de la route.
Vous pouvez le faire sur votre sur en faisant votre propre réflexion et la construction d'un mixin AspectJ ITD.
Ou vous pouvez utiliser Spring Roo et de faire un Spring Roo Addon. Votre Roo addon va faire quelque chose de similaire au précédent, mais sera disponible pour tout le monde qui utilise Spring Roo et vous n'avez pas à utiliser d'Exécution des Annotations.
J'ai fait les deux. Les gens de la merde sur Spring Roo mais c'est vraiment le plus complet de génération de code Java.
Une autre voie possible est ici.
La BeanWrapper propose une fonctionnalité pour définir et obtenir les valeurs de propriété (individuellement
ou en vrac), obtenir la propriété des descripteurs, et aux propriétés de la requête pour déterminer si elles
sont lisibles ou à l'écriture.
Si il s'agit d'un objet simple arbre à la liste de valeurs de clé de cartographie, d'où la clé peut-être un pointillé chemin de la description de l'objet de l'élément racine à la feuille de l'inspection, il est assez évident qu'un arbre de conversion d'une valeur-clé de la liste est comparable à un objet pour le mappage xml. Chaque élément dans un document XML a une position définie et peut être converti en un chemin d'accès. Donc j'ai pris XStream comme une base et stable de l'outil de conversion et remplacé à la hiérarchie de pilote et écrivain pièces avec une propre mise en œuvre. XStream est également livré avec un chemin d'accès de base de suivi mécanisme qui, combiné avec les deux autres - strictement conduit à une solution convenant à la tâche.
Avec l'aide de Jackson bibliothèque, j'ai été en mesure de trouver toutes les propriétés de la classe de type String/integer/double, et les valeurs respectives dans une classe Map. (sans l'aide de réflexions api!)
En utilisant Gson,
object
JsonConvertir en Json à la Carte