关于如何在 SlingModel 上创建一个 changewatcher 以启用对 JCR 的持久性的建议

Suggestions on how to create a changewatcher on a SlingModel to enable persistence to the JCR

我们目前正在尝试实现对 SlingModels 的扩展,以允许将 slingmodel 直接保存到 JCR。

我们的策略考虑了 2 个起始条件: 1.要持久化的新对象 2. 已从​​ JCR 检索、更改并再次持久化的对象

对于情况 1,我们使用反射来检查对象,为模型创建一个新节点,为找到的任何原始变量插入属性,并对找到的任何复杂模型对象递归使用相同的持久化方法变量和集合。

我关于最佳方法的问题与情况2有关。如果我们从存储库中拉出一个对象,我们不能保证该节点不会同时被同步更改。因此,我们想在 SlingModel 上实现一个更改观察器,以记录所做的任何更改的事务日志。然后,当再次将对象持久化回 JCR 时,事务可用于设置相关属性。

我考虑过使用观察者模式,但这意味着我们需要在每个 SlingModel 的 setter 中实现一个函数,这根本不理想,因为它需要开发人员记住添加代码并正确执行。

理想情况下,我想直接在变量上实现拦截器之类的东西,或者如果不可能的话,在 setter 本身上实现,并要求每个模型都需要使用 getter/setter 对于每个变量。我们可以配置代码扫描工具来强制开发人员实施 getter/setters.

在这里接触变更观察者的最佳方式是什么?

import java.util.List;

public class Teacher {

    private String userName;
    private String cource;
    private List<Student> students;

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCource() {
        return cource;
    }

    public void setCource(String cource) {
        this.cource = cource;
    }
}

public class Student {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


public class ClassFacadeCglib implements MethodInterceptor{

    private Object target; 

    public Object getInstance(Object target) {  
        this.target = target;  
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(this.target.getClass());  
        // callback method
        enhancer.setCallback(this);  
        // create proxy object
        return enhancer.create();  
    }  

    @Override
    public Object intercept(Object obj, Method method, Object[] args,  
        MethodProxy proxy) throws Throwable {

        if(method.getName().startsWith("set")){
                System.out.println(method.getName()+" start");  
                proxy.invokeSuper(obj, args);  
                System.out.println(method.getName()+" end..");  
        }

        if(method.getName().startsWith("get")){
            System.out.println(method.getName()+" start");  
            proxy.invokeSuper(obj, args);  
            System.out.println(method.getName()+" end");  
        }

        return null;  
    }

}


public class Main {

    public static void main(String[] args) {  
        ClassFacadeCglib cglib=new ClassFacadeCglib();  
        Teacher teacher=(Teacher)cglib.getInstance(new Teacher());  
        teacher.setCource("Math");
        teacher.getUserName(); 
    } 

}

注:
运行 需要 cglib-full-2.0.2.jar。 见 https://repo1.maven.org/maven2/cglib/cglib-full/2.0.2/