De nivellement, de profondeur de cartographie ne fonctionne pas
Je suis en train d'utiliser des bulldozers 4.1 à la carte entre les classes. J'ai une source de classe qui ressemble à ceci:
public class initRequest{
protected String id;
protected String[] details
}
J'ai une classe de destination qui ressemble à ceci:
public class initResponse{
protected String id;
protected DetailsObject detObj;
}
public class DetailsObject{
protected List<String> details;
}
Donc, essentiellement, je veux la chaîne dans les détails de tableau pour être placés dans la Liste dans les Détails de l'objet.
J'ai essayé une cartographie comme ceci:
<mapping wildcard="true" >
<class-a>initRequest</class-a>
<class-b>initResponse</class-b>
<field>
<a is-accessible="true">details</a>
<b is-accessible="true">detObj.details</b>
</field>
</mapping>
Mais j'obtiens cette erreur:
Exception in thread "main" net.sf.dozer.util.mapping.MappingException: java.lang.NoSuchFieldException: detObj.details
at net.sf.dozer.util.mapping.util.MappingUtils.throwMappingException(MappingUtils.java:91)
at net.sf.dozer.util.mapping.propertydescriptor.FieldPropertyDescriptor.<init>(FieldPropertyDescriptor.java:43)
at net.sf.dozer.util.mapping.propertydescriptor.PropertyDescriptorFactory.getPropertyDescriptor(PropertyDescriptorFactory.java:53)
at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestPropertyDescriptor(FieldMap.java:370)
at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestFieldType(FieldMap.java:103)
at net.sf.dozer.util.mapping.util.MappingsParser.processMappings(MappingsParser.java:95)
at net.sf.dozer.util.mapping.util.CustomMappingsLoader.load(CustomMappingsLoader.java:77)
at net.sf.dozer.util.mapping.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:149)
at net.sf.dozer.util.mapping.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:132)
at net.sf.dozer.util.mapping.DozerBeanMapper.map(DozerBeanMapper.java:94)
Comment puis-je carte ce de sorte que cela fonctionne?
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne pour moi. Je suis en utilisant la version 5.2.1
Note que "est accessible" n'est pas nécessaire pour . Espérons que cela aide
Problème résolu...
est-accessible permet à un objet d'être mis à jour indépendamment de modificateur d'accès et la présence de getters/setters (indispensable pour les objets générés à l'aide de JAXB)
"point" de la notation de la profondeur de la cartographie des œuvres d'accéder à des objets imbriqués
La combinaison des deux est une fonctionnalité qui ne fonctionne pas dans Bouteur (peut-être qu'il le fait dans une version plus récente)
solution...
modifier le fichier xsd, tels que la profondeur de la cartographie n'est pas nécessaire. Ce n'est pas la solution idéale, mais ses mieux que d'écrire un convertisseur personnalisé pour chaque objet
En cas de JaxB, vous pouvez télécharger et utiliser le plugin pour générer les organismes de normalisation. Consulter ce lien pour plus de détails, https://jaxb2-commons.dev.java.net/collection-setter-injector/
Je suppose que les accesseurs (getter /setter) sont manquantes.
Par la façon dont je pense que vous aurez également besoin de fournir un constructeur vide pour DetailsObject donc bulldozer peut instancier.
Doit être remplacé par
Bien qu'il semble que vous ne peut pas utiliser le "est accessible" et la notation point ensemble une autre approche est de briser votre profonde de cartographie en petits mappages.
Nous avons couru dans cette situation avec JAX-WS code généré. Vous avez des listes qui n'ont pas de setter et dans notre cas, ont été profondément imbriqués. Nous avons trouvé notre solution par tout simplement la rupture de la grande profondeur de la cartographie en petits mappages qui "marchait" notre manière à ce que nous voulions. J'ai essayé de l'expliquer dans mon blog ici:
http://btarlton.blogspot.com/2014/08/dozer-deep-nestinga-different-approach.html
Mais le truc, c'est juste de marche de l'arborescence de l'objet par la plus petite des mappings et l'aide est accessible="true" lorsque cela est nécessaire pour accéder à la liste avec pas de setter et de l'utilisation de "ce" que le nom de la propriété pour garder le passage de la source.
Espérons que cette aide!
Pour résumer il y a des options suivantes pour ce problème
1) Utiliser JaxB pluggin pour permettre setters comme expliqué par Naveen
2) l'Utilisation est accessible pour ces propriétés
Je crois que l'aide à la première approche inutilement expose les setters pour les collections/listes comme vous pouvez le risque de paramètre avec la valeur null.
Nous avons décidé de permettre est accessible pour ces domaines (et pas à l'ensemble de la classe) pour éviter les effets secondaires.
J'ai discuté de la solution à Bulldozer de la Cartographie au niveau de la Classe est accessible