quelle est la meilleure façon de fusionner deux beans java dans l'API RESTful?


Le scénario est simple: L'interface utilisateur appelle l'API RESTful pour obtenir une arborescence d'objets, puis l'interface utilisateur modifie certaines données et appelle l'API RESTful pour la mettre à jour.

Mais pour des raisons de sécurité ou de performance..., mon API RESTful ne peut PAS apporter toute l'arborescence d'objets à l'interface utilisateur.

Nous avons deux choix à cet effet: créer un Bean Java individuel pour l'API RESTful ou étendre le Bean Java d'entreprise existant plus @JsonIgnore.

La seconde semble plus intelligente car nous réutilisons la classe affaires.

Mais maintenant nous avons un problème: j'ai besoin de fusionner l'objet de l'interface utilisateur avec l'objet de la base de données, sinon je perdrai des données.

Mais comment puis-je savoir quelle donnée proviendra de l'interface utilisateur? Je sais que je peux coder en dur pour copier les champs un par un. Mais cette façon est dangereuse.

Je demande un moyen générique d'éviter le code dur pour copier les champs.

J'ai essayé org.Apache.commun.beanutils.BeanUtils, mais il ne peut pas répondre à l'exigence car il écrase toujours la cible Fields.

Donc je pense de cette façon:
Si le champ du bean UI n'est pas Null, écrasez la valeur du champ du même nom dans le bean de destination. mais comment puis-je gérer si le champ est une sorte de type primitif comme int qui a la valeur par défaut 0? Je ne sais pas si le champ porte vraiment une valeur d'interface utilisateur 0 ou ne revient tout simplement pas de l'interface utilisateur.

J'ai essayé de convertir le type primitif en type d'objet, mais il a toujours des problèmes sur le type booléen, de nombreux outils java ne prennent pas en charge " Booléen isValid () {}} " comme BeanUtils. Et ce type de conversion est dangereux sur le code existant.

J'ai essayé ces codes:

JacksonAnnotationIntrospector ai = new JacksonAnnotationIntrospector();
AnnotatedClass ac = AnnotatedClass.construct(MyClassDTO.class, ai, null);
    String[] ignoredList = ai.findPropertiesToIgnore(ac);       
    for(String one: ignoredList){
        System.out.println(one);
    }

Mais ignoredList est toujours null. J'utilise Jackson 1.9.2

Author: Justin, 2015-03-31

2 answers

Vous pouvez envisager d'utiliser JsonPatch. Nous l'utilisons et cela fonctionne assez bien. Bien sûr, cela signifie que vous appliquez des correctifs au niveau JSON et non directement dans le bean, donc si vous devez prendre en charge plus que JSON, cela peut poser problème.

Voici une implémentation: https://github.com/fge/json-patch

 0
Author: mprivat, 2015-04-07 19:04:43

J'ai trouvé la solution sur Jackson:

MyBean defaults = objectMapper.readValue(defaultJson, MyBean.class);
ObjectReader updater = objectMapper.readerForUpdating(defaults);
MyBean merged = updater.readValue(overridesJson);

Il vient de:

ReaderForUpdating

La Fusion sur Jackson

 0
Author: Justin, 2017-05-23 12:07:46