如何通过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
相关产品推荐
相关产品推荐

