是否可以为target value变更场景设置自定义触发action?
映射过程属性变更标记实现方案
该需求完全可以通过主流映射框架的现有扩展能力实现,无需依赖未公开的内部接口,以下为两种常用的落地方式:
方案1:后置比对法(推荐,无业务侵入)
- 实现逻辑:在映射(mapping)流程执行完成后,统一比对源对象和目标对象的属性值,存在差异则将目标对象标记为已变更,完全不会影响非映射场景下的setter调用,也不需要修改目标类原有业务逻辑。
- 实现步骤:
- 给目标类添加变更标记字段:
public class TargetObject { // 原有类字段、getter、setter省略 private boolean isUpdated = false; public boolean isUpdated() { return isUpdated; } public void setUpdated(boolean updated) { isUpdated = updated; } }- 在映射Mapper中添加后置处理方法,以MapStruct为例:
import java.util.Objects; import org.mapstruct.AfterMapping; import org.mapstruct.Mapper; import org.mapstruct.MappingTarget; @Mapper public interface CustomObjectMapper { void updateTargetFromSource(SourceObject source, @MappingTarget TargetObject target); @AfterMapping default void checkAttributeChange(SourceObject source, @MappingTarget TargetObject target) { boolean hasChanged = false; // 按需比对需要追踪的字段,示例仅列两个字段 if (!Objects.equals(source.getAttr1(), target.getAttr1())) { hasChanged = true; } if (!Objects.equals(source.getAttr2(), target.getAttr2())) { hasChanged = true; } // 字段较多时可改用反射工具类批量比对,无需手动逐个枚举 if (hasChanged) { target.setUpdated(true); } } }
方案2:实时拦截法
如果需要在属性赋值的瞬间就标记变更,不需要等全部映射流程完成,可以用框架的装饰器/拦截器扩展:
- 自定义映射逻辑装饰类,给目标对象套一层临时动态代理,拦截映射过程中所有的setter调用,只有新值和旧值不一致时才执行赋值,同时标记变更状态。
- 该方案适合字段数量多、需要精准追踪单个字段变更的场景,同样不会影响目标类原生setter的正常调用。
内容的提问来源于stack exchange,提问作者cattox
相关产品推荐
相关产品推荐

