2017-02-14 4 views
1

Ich habe derzeit eine Map<String, String>, die Werte in der Form key = value enthält und ich möchte diese in ein reales Objekt "erweitern".MapStruct: Zuordnung von java.util.Map zu Bean?

Ist es möglich, das mit MapStruct zu automatisieren und wie würde ich das machen?

Zur Klarstellung:

public MyEntity mapToEntity(final Map<String, String> parameters) { 
    final MyEntity result = new MyEntity(); 
    result.setNote(parameters.get("note")); 
    result.setDate(convertStringToDate(parameters.get("date"))); 
    result.setCustomer(mapIdToCustomer(parameters.get("customerId"))); 
    // ... 
    return result; 
} 
+0

Ich denke, dass dies derzeit in MapStruct nicht möglich ist. Es sieht jedoch interessant aus. Können Sie ein Problem im MapStruct [Issue Tracker] (https://github.com/mapstruct/mapstruct/issues) als neues Feature erstellen, das möglicherweise hinzugefügt wird, wenn die Leute daran interessiert sind. – Filip

Antwort

0

Methode 1

Die MapStruct Repo gibt uns nützliche Beispiele wie Mapping from map: Der Code, den ich von Hand schreiben würde wie folgt aussehen würde.

von einem java.util.Map eine Bohne Mapping würde in etwa so aussehen:

@Mapper(uses = MappingUtil.class) 
public interface SourceTargetMapper { 

    SourceTargetMapper MAPPER = Mappers.getMapper(SourceTargetMapper.class); 

    @Mappings({ 
     @Mapping(source = "map", target = "ip", qualifiedBy = Ip.class), 
     @Mapping(source = "map", target = "server", qualifiedBy = Server.class), 
    }) 
    Target toTarget(Source s); 
} 

Beachten Sie die Verwendung der MappingUtil Klasse MapStruct herauszufinden, zu helfen, den richtigen Umgang mit Werten aus der Karte extrahieren:

public class MappingUtil { 

    @Qualifier 
    @Target(ElementType.METHOD) 
    @Retention(RetentionPolicy.SOURCE) 
    public @interface Ip { 
    } 

    @Qualifier 
    @Target(ElementType.METHOD) 
    @Retention(RetentionPolicy.SOURCE) 
    public static @interface Server { 
    } 

    @Ip 
    public String ip(Map<String, Object> in) { 
     return (String) in.get("ip"); 
    } 

    @Server 
    public String server(Map<String, Object> in) { 
     return (String) in.get("server"); 
    } 
} 

Methode 2

per Raild Kommentar zu the issue related to this post ist es möglich, MapSt zu verwenden ruct Ausdrücke ähnliche Ergebnisse in kürzerem Weg zu erreichen:

@Mapping(expression = "java(parameters.get(\"name\"))", target = "name") 
public MyEntity mapToEntity(final Map<String, String> parameters); 

Kein Hinweis auf Leistung kann allerdings und Typumwandlung auf diese Weise schwieriger sein, aber für eine einfache String-String-Mapping, sieht es sauberer.

Verwandte Themen