2017-09-19 272 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