2017-10-09 6 views
1

Je cas d'utilisation où je dois carte ou remplir des données pour les champs particuliersSeule la carte particulière Les champs de DTO -> Modèle par carte-Struct

par exemple: Je suis un modèle utilisateur que je dois convertir en UserDTO avec seulement des champs particuliers comme le nom d'utilisateur et accountId.

Modèle:

public class UserCore{ 

     private String accountId; 

     private String username; 
     private String workEmail; 
     private String firstName; 
     private String password; 
     private String hashedPassword; 

    } 

UserDTO:

public class UserCoreDTO{ 

     private String accountId; 

     private String username; 
     private String workEmail; 
     private String firstName; 
     private String password; 
     private String hashedPassword; 

    } 

est-il possible de carte-struct afin que je puisse seulement mapper des domaines particuliers de la source à destination

par exemple : UserMapper mapper = Mappers.getMapper (UserMapper.class);

mapper.map (fieldsToFetch, source, destination);

+0

Qu'avez-vous essayé jusqu'à présent? –

+0

@DarrenForsythe je vois dans la documentation de carte-struct je n'ai trouvé aucun soutien pour l'exigence ci-dessus c'est pourquoi je suis venu à SO. C'est une pratique habituelle pour tout le monde de dire ce que vous avez essayé jusqu'ici sans même comprendre la question. pas pour blesser –

Répondre

0

Voici un exemple de la forme docs:

@Mapper 
public interface FishTankMapper { 

    @Mappings({ 
     @Mapping(target = "fish.kind", source = "fish.type"), 
     @Mapping(target = "fish.name", ignore = true), 
     @Mapping(target = "ornament", source = "interior.ornament"), 
     @Mapping(target = "material.materialType", source = "material"), 
     @Mapping(target = "quality.report.organisation.name", source = "quality.report.organisationName") 
    }) 
    FishTankDto map(FishTank source); 
} 

ignore = true ne fonctionnera probablement pour tous les champs, et pas seulement les champs imbriqués comme dans l'exemple.

+0

ici, nous sommes le champ de codage dur qui doit être exclu. Ma question est différente. Y a-t-il un moyen dynamique de le faire? par exemple, je développe une API qui accepte param comme fieldsToFetch = nom d'utilisateur, salaire (c'est-à-dire que la réponse de l'API ne doit contenir que le nom d'utilisateur et le salaire). fieldsToFetch est un critère client. –

+0

Ce que vous cherchez ne peut pas travailler. La structure de carte génère du code java pour les classes de mappage _at build time_. Vous ne connaîtrez que les champs à l'exécution, vous devrez regarder les outils qui utilisent la réflexion pour résoudre ce problème à l'exécution. Sachez que la raison pour laquelle mapstruct le fait au moment de la construction n'est pas d'engager le coût de la réflexion à l'exécution. – Alpar