You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可以为target value变更场景设置自定义触发action?

映射过程属性变更标记实现方案

该需求完全可以通过主流映射框架的现有扩展能力实现,无需依赖未公开的内部接口,以下为两种常用的落地方式:

方案1:后置比对法(推荐,无业务侵入)

  • 实现逻辑:在映射(mapping)流程执行完成后,统一比对源对象和目标对象的属性值,存在差异则将目标对象标记为已变更,完全不会影响非映射场景下的setter调用,也不需要修改目标类原有业务逻辑。
  • 实现步骤:
    1. 给目标类添加变更标记字段:
    public class TargetObject {
        // 原有类字段、getter、setter省略
        private boolean isUpdated = false;
    
        public boolean isUpdated() {
            return isUpdated;
        }
    
        public void setUpdated(boolean updated) {
            isUpdated = updated;
        }
    }
    
    1. 在映射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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 16:06:03