2017-07-21 2 views
1

J'ai un scénario dans lequel je dois convertir Resource objets (à partir de demandes réseau) en RealmObject objets (couche de données) en utilisant MapStruct pour gérer le mappage d'objet. Je cherche à créer une interface Mapper générique pour éviter d'avoir à définir un mappeur personnalisé pour chaque ressource, comme ceci:L'utilisation de MapStruct dans Android pour mapper des types génériques?

import org.mapstruct.Mapper; 
import org.mapstruct.factory.Mappers; 

import io.realm.RealmObject; 
import moe.banana.jsonapi2.Resource; 

@Mapper 
public interface ResourceMapper <T extends Resource, I extends RealmObject> { 
    ResourceMapper INSTANCE = Mappers.getMapper(ResourceMapper.class); 

    I resourceToRealm(T resource); 
} 

mais cela se traduit par une erreur de build (compilation est réussie, cependant):

Error:(13, 4) error: Can't generate mapping method for a generic type variable source.

N'est-ce pas possible? Sinon, je devrais créer un mappeur personnalisé pour chaque Resource et utiliser un switch pour indiquer au désérialiseur quel mapper utiliser en fonction du type de classe etc ... il deviendrait probablement moche et n'entraînerait pas de code très SEC. Leur documentation n'est pas très clair à ce sujet.

+0

https://github.com/mapstruct/mapstruct/issues/583 semble être encore en phase d'amélioration pour les types génériques – Mani

+0

Le problème lié est une amélioration pour quelque chose d'autre, pas ce que la question concerne – Filip

Répondre

1

EDIT 1:

De Documentation,

The generated implementation uses plain Java method invocations for mapping between source and target objects, i.e. there is no reflection involved. By default, properties are mapped if they have the same name in source and target, but this and many other aspects can be controlled using @Mapping and a handful of other annotations.


Je doute que ce soit possible pour un tel contrat de cartographe. Nous ne pouvions pas dire quel type serait instancié à la suite de cette génération automatique.

Il y a deux résultats attendus

  1. Génération d'une classe de type I (je suppose que c'est ce que vous seriez attendez)-Currently not possible
  2. générons d'une classe de type RealmObject et base uniquement attributs méthode et les méthodes sont mis en correspondance

Incase vous voulez deuxième résultat, s'il vous plaît suivre comme par this

+1

Le problème lié à la le premier résultat attendu n'est pas correct. Le problème ici est autre chose. Le deuxième résultat est ce qui est correct. Si l'on déclare un mappeur générique, MapStruct n'a aucun moyen de savoir quels types il doit utiliser pour générer le code. Gardez à l'esprit que MapStruct génère uniquement du code de mappage et utilise ** aucune réflexion ** pendant l'exécution. Je ne suis pas sûr s'il est sage pour MapStruct de générer des mappages entre toutes les combinaisons possibles d'un mappeur générique. – Filip

+0

Prenez soin de vérifier cette question aussi? https://stackoverflow.com/questions/46663109/mapstruct-mapping-realmlist-relationship –