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

如何通过Spring AOP拦截字段Setter方法并修改字段值

解决方案

要实现拦截字段的Setter方法并修改设置的值,需要调整切面的切点表达式,匹配带有@Translate注解字段对应的Setter方法,同时在通知中修改入参值,具体修改如下:

1. 保留Translate注解(无需修改)

注解仍标记在字段上,用于标识需要翻译的目标字段:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Translate {
}

2. 修改切面类的切点与通知逻辑

使用@Around通知拦截Setter方法,通过切点匹配对应字段带@Translate注解的setter,并在执行方法前修改入参:

@Aspect
@Component
public class TranslationAspect {

    @Autowired
    private TranslationService translationService;

    // 切点:匹配所有以set开头的方法,同时获取目标对象和方法入参
    @Pointcut("execution(* set*(..)) && target(target) && args(arg)")
    public void setterMethod(Object target, Object arg) {}

    @Around("setterMethod(target, arg)")
    public Object translateSetter(ProceedingJoinPoint joinPoint, Object target, Object arg) throws Throwable {
        // 从Setter方法名推导对应字段名(例如setName对应name)
        String methodName = joinPoint.getSignature().getName();
        String fieldName = methodName.substring(3, 4).toLowerCase() + methodName.substring(4);

        try {
            Field field = target.getClass().getDeclaredField(fieldName);
            // 检查字段是否带有@Translate注解,且入参是String类型
            if (field.isAnnotationPresent(Translate.class) && arg instanceof String) {
                // 翻译后替换原入参,执行原方法
                String translatedValue = translationService.getTranslation((String) arg);
                return joinPoint.proceed(new Object[]{translatedValue});
            }
        } catch (NoSuchFieldException e) {
            // 字段不存在时直接执行原方法
        }
        // 无匹配注解或非String类型,直接执行原方法
        return joinPoint.proceed();
    }
}

3. 配置类与POJO保持不变

配置类和标记了@Translate的POJO无需修改:

// Config class
@Configuration
@EnableAspectJAutoProxy
public class AspectConfig {
}

// POJO
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ResponseObt implements Serializable {
    @Translate
    private String name;
}

核心逻辑说明

  • 切点execution(* set*(..))匹配所有Setter方法,结合args(arg)和target(target)获取方法入参与目标对象。
  • 通过Setter方法名推导字段名,反射校验字段是否带有@Translate注解。
  • 使用@Around通知在方法执行前修改入参,直接将翻译后的值传入原方法,避免先设置再修改的冗余操作,更高效实现需求。

内容的提问来源于stack exchange,提问作者srinivas vishnu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:30:26