MapStruct命名映射方法使用@Context额外参数编译失败求助
解决方案
错误原因
你遇到的编译错误核心是MapStruct无法正确匹配带@Context参数的限定映射方法:
- 抽象方法中的
String type参数未标记为@Context,导致MapStruct无法将其传递给@Named("toOrderDetails")的方法 - 由于上下文参数未被识别,MapStruct找不到符合签名的限定方法,进而抛出映射失败的错误
修正步骤
- 给抽象方法的
type参数添加@Context注解:明确告诉MapStruct这是一个上下文参数,需要传递给下游的映射方法 - 保持限定方法的参数签名匹配:限定方法的
@Context参数会自动和抽象方法的@Context参数关联,无需在@Mapping中额外配置
修正后的代码
@Component @Mapper(componentModel = "spring") public abstract class OrderMapper { @Autowired private ObjectMapper objectMapper; @Mapping(source = "type", target = "type") @Mapping(source = "resource.data", target = "properties", qualifiedByName = "toOrderDetails") public abstract Order toEntity(final OrderResource resource, @Context final String type); @Named("toOrderDetails") public OrderDetails maptoOrderDetails(final Map<String, Object> data, @Context final String type) { // handle data and type... return new OrderDetails(); } }
补充说明
@Context参数不会被当作映射的源或目标属性,而是作为额外的上下文信息在映射链中传递- 当使用
qualifiedByName时,MapStruct会自动匹配带有相同@Context参数的方法,无需在@Mapping中指定上下文参数的来源
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

