如何在MapStruct映射器满足条件时返回null?
MapStruct 满足复杂条件时返回 null 的实现方案
@AfterMapping 方法的返回值会被 MapStruct 忽略,它的设计初衷是修改通过 @MappingTarget 传入的对象,而非替换整个映射结果。要实现满足复杂条件时返回 null 的需求,可采用以下两种方案:
方案一:在映射方法中直接实现条件判断
将复杂判断逻辑放在对外暴露的映射方法中,内部封装实际的映射逻辑:
class User{ String name; Role role; Date birthDate; } @Mapper(componentModel = "spring") interface UserMapper{ // 内部实际执行映射的方法(仅内部调用) User doToUser(Source source); // 对外暴露的映射方法,包含条件判断逻辑 default User toUser(Source source) { // 此处写入你的复杂条件判断 if (condition) { return null; } // 条件不满足时,执行正常映射 User user = doToUser(source); // 若需对映射后的User做额外处理,可调用自定义方法修改对象 checkUser(user); return user; } // 用于修改映射后的User对象(可选,按需保留) default void checkUser(@MappingTarget User user){ // 在这里实现对user的后续校验或字段调整逻辑 } }
方案二:使用 @BeforeMapping 结合 MappingContext 终止映射
利用 MapStruct 提供的 MappingContext,在映射流程启动前判断条件,直接设置返回结果为 null,跳过后续映射步骤:
class User{ String name; Role role; Date birthDate; } @Mapper(componentModel = "spring") interface UserMapper{ User toUser(Source source); @BeforeMapping default void checkCondition(Source source, MappingContext context) { // 此处写入你的复杂条件判断 if (condition) { // 设置映射结果为null,MapStruct会直接返回该值,不再执行后续映射操作 context.setMappingResult(null); } } // 若需对映射后的User做处理,可保留@AfterMapping方法(仅条件不满足时执行) @AfterMapping default void checkUser(@MappingTarget User user){ // 对user的后续处理逻辑 } }
方案对比
- 方案一更直观,适合需要在返回前对映射结果做额外加工的场景;
- 方案二更贴合 MapStruct 的生命周期设计,无需拆分映射方法,适合仅需通过条件终止映射的场景。
内容的提问来源于stack exchange,提问作者Ahmed Aboshady
相关产品推荐
相关产品推荐

