【问题标题】:check the changes in old object and new object using spring使用spring检查旧对象和新对象的变化
【发布时间】:2013-08-30 09:29:19
【问题描述】:

我的确切要求是将旧对象和新对象的值一起记录。例如,如果以前用户的名称是“AAA”并且有人将名称更改为“CCC”而不是在服务层中,我需要像这样记录“用户名从 AAA 更改为 CCC,日期为 2013 年 9 月 10 日”。 请在spring框架中提供一些解决方案。

【问题讨论】:

  • 你可能想看看 Apache 的 BeanUtils
  • 你试过什么?我认为 Spring 中没有类似的 OOTB。

标签: java spring logging


【解决方案1】:

可以使用Spring AOP,拦截bean的setter,记录属性变化,基本思路在这里

class B1 {
    String name = "xxx";
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

@Aspect
class A1 {
    @Before("execution(void test.B1.set*(*))")
    public void before(JoinPoint jp) throws Exception {
        String prop = jp.getSignature().getName().substring(3);
        Object target = jp.getTarget();
        Object before = target.getClass().getMethod("get" + prop).invoke(target);
        Object now = jp.getArgs()[0];
        System.out.println(prop + " changed from " + before + " to " + now);
    }
}

public class Test1 {

    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("test1.xml");
        B1 b1 = ctx.getBean(B1.class);
        b1.setName("yyy");
    }
}

这个打印出来

Name changed from xxx to yyy

test1.xml

...
    <context:annotation-config />
    <aop:aspectj-autoproxy />
    <bean class="test.B1" />
    <bean class="test.A1" />
...

【讨论】:

    【解决方案2】:

    据我所知,Spring 不提供任何此类功能。

    但是,您想要的很容易实现: 使用Reflection,或使用BeanUtils,无论如何在内部使用Reflection。使用其中任何一个,您都可以遍历对象的属性并创建 Map 或包含必要详细信息的内容。看看这两个答案:

    common-algorithm-for-generating-a-diff-of-the-fields-in-two-beans

    find-out-the-differences-between-two-java-beans-for-version-tracking

    或者,有一个名为java-object-diff 的库可以为您完成。它还支持深度对象比较,并为您处理大量复杂性。

    另外,您可能对此JIRA issue with BeanUtils 感兴趣。请参阅 cmets 部分。

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 2016-12-07
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2013-11-12
      • 1970-01-01
      相关资源
      最近更新 更多