2017-09-19 27 views
0

在MapStruct版本1.1.0.Final,這是可能的....MapStruct:如何將輸入對象傳遞給表達式?

@Mappings({ 
    @Mapping(target = "transaction.process.details", expression = "java(MappingHelper.mapDetails(request))"), 
    //more mappings 
}) 
Response requestToResponse(Request request); 

這是可能的,因爲mapDetails方法爲(由巧合?)插入requestToResponse方法生成。這就是爲什麼request不爲空。

現在,由於1.1.0.Final沒有與龍目島合作,我不得不升級到1.2.0.CR2。有了這個版本,mapDetails將生成一個單獨的方法,其中request未被傳遞,因此request現在在此方法中爲null,並且我得到了具有該表達式的NPE。 (這是現在的requestToResponse的子子方法。)

我誤用了表達式,它是剛巧巧合工作,還是新版本有bug?如果沒有錯誤,我該如何正確地將request實例傳遞給表達式?

回答

2

您曾經/正在濫用該表達。你需要做的是將你的目標映射到源參數。然後

@Mapper(uses = { MappingHelper.class }) 
public interface MyMapper { 

    @Mappings({ 
     @Mapping(target = "transaction.process.details", source = "request"), 
     //more mappings 
    }) 
    Response requestToResponse(Request request); 
} 

MapStruct應建立中介方法和使用MappingHelper並調用mapDetails方法。如果你有多種方法從Request映射到任何類型的details,那麼你將需要使用限定的映射(參見文檔中的更多here)。

它看起來是這樣的:

public class MappingHelper { 
    @Named("mapDetails") // or the better type safe one with the meta annotation @Qualifier 
    public static String mapDetails(Request request); 
} 

你的映射會是這樣的:

@Mapper(uses = { MappingHelper.class }) 
public interface MyMapper { 

    @Mappings({ 
     @Mapping(target = "transaction.process.details", source = "request", qualifiedByName = "mapDetails"), //or better with the meta annotation @Qualifier qualifiedBy 
     //more mappings 
    }) 
    Response requestToResponse(Request request); 
} 
+0

感謝,再次工作:) – Bevor

+0

請確保您有這個良好的測試中,嵌套目標屬性在1.2.0版本中得到了增強,並且可能會出現無法正常工作的情況(之前也是錯誤的) – Filip