2

私の正確な要件は、古いオブジェクトと新しいオブジェクトの値を一緒にログに記録することです。たとえば、以前にユーザーの名前が「AAA」で、誰かが名前を「CCC」に変更した場合、サービス層よりも「ユーザー名が 2013 年 9 月 10 日に AAA から CCC に変更されました」のようにログに記録する必要があります。春のフレームワークでいくつかの解決策を提供してください。

4

2 に答える 2

1

Spring AOP を使用して、Bean のセッターをインターセプトし、プロパティの変更をログに記録できます。基本的な考え方はこちら

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" />
...
于 2013-08-30T10:00:37.127 に答える
1

私の知る限り、Spring はそのような機能を提供していません。

ただし、必要なことは非常に簡単に実現できます。Reflection を使用するか、とにかく内部でReflectionを使用するBeanUtilsを使用します。これらのいずれかを使用して、オブジェクトのプロパティを繰り返し処理しMap、必要な詳細を含む または 何かを作成できます。次の 2 つの回答を見てください。

2 つの Bean でフィールドの差分を生成するための共通アルゴリズム

バージョン追跡用の 2 つの Java Bean 間の違いを見つける

または、それを実行できるjava-object-diffという名前のライブラリがあります。また、深いオブジェクト比較をサポートし、多くの複雑さを処理します。

また、 BeanUtils に関するこの JIRA の問題に興味があるかもしれません。コメントセクションを参照してください。

于 2013-08-30T09:42:39.293 に答える