2017-02-14 115 views
1

我目前有一個Map<String, String>,它包含key = value形式的值,我想將它們「擴展」爲真實的對象。MapStruct:從java.util.Map到Bean的映射?

是否可以使用MapStruct實現自動化?我該怎麼做?

爲了澄清:我會用手工編寫的代碼會是這個樣子:

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

我認爲目前這在MapStruct中是不可能的。但是,它看起來很有趣。你可以在MapStruct [問題跟蹤器](https://github.com/mapstruct/mapstruct/issues)中創建一個問題作爲一個新功能,如果人們對它感興趣,它可能會被添加。 – Filip

回答

0

方法1

的MapStruct回購爲我們提供了有用的例子如Mapping from map

從java.util.Map映射豆會看起來像:

@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); 
} 

注意使用MappingUtil類的幫助MapStruct搞清楚如何正確地從地圖中提取值:

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"); 
    } 
} 

方法2

按Raild評論the issue related to this post,可以使用MapSt構作表達式實現在更短的方式類似的結果:

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

沒有注意到對性能雖然和類型轉換可能是這樣的麻煩,但一個簡單的串來串映射,它看起來更清潔。

相關問題