java - 关于如何在 SlingModel 上创建变更观察程序以实现 JCR 持久化的建议

标签 java aem sling-models

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

我们的策略有 2 个经过深思熟虑的起始条件: 1. 一个要持久化的新对象 2. 已从​​ JCR 检索、更改并随后再次持久化的对象

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

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

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

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

接触变革观察者的最佳方式是什么?

最佳答案

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/

关于java - 关于如何在 SlingModel 上创建变更观察程序以实现 JCR 持久化的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33411554/

相关文章:

Java远程调试开销

java - 在此字符串操作期间将创建多少个对象?

lucene - CQ5.6.1 lucene配置文件在哪里?

maven - IntelliJ 中的构建模块实际上为 maven 模块做了什么

aem - 如何让 "Delegation Pattern for Sling Models"工作?

org.bson.BSONObject 中的 java 类型

java - openCV 中的 cvtColor 创建拉伸(stretch)图像数组?

java - CQ5/JSP如何加载文件夹内容

java - 通过maven部署第3方OSGI包