请问ScreenPermissionTreeDatasource这个类可以重写吗?

不知道这个类是怎么注册到Spring的,我用<bean id=“cuba_ScreenPermissionTreeDatasource” 没成功,可以通过id来重写这个类么?

貌似用Guice注入的

不是吧,是spring注入的

   Component instance = constructor.newInstance();
        autowireContext(instance);
        initCompositeComponent(instance, componentClass);

看到了这个,反射创建实例后在放到spring applicationContext中。虽然没看到 ScreenPermissionTreeDatasource的创建,但感觉可能也是这样操作的 :speak_no_evil:

private Datasource loadCollectionDatasource(Element element, Datasource ds, String property) {
    initPropertyDatasourceAttributes(element, ds, property);

    CollectionDatasource datasource = builder
            .setDsClass(getDatasourceClass(element))
            .buildCollectionDatasource();

    loadDatasources(element, datasource);

    return datasource;
}

会不会是这个 dsClass.newInstance(); 创建的,你可调试看看。

public CollectionDatasource buildCollectionDatasource() {
    init();
    CollectionDatasource datasource;
    try {
        if (master == null && property == null) {
            if (dsClass == null) {
                datasource = createCollectionDatasource();
            } else {
                datasource = (CollectionDatasource) dsClass.newInstance();
            }
            datasource.setup(dsContext, dataSupplier, id, metaClass, view);
            if (maxResults > 0)
                datasource.setMaxResults(maxResults);
            else if (metaClass != null)
                datasource.setMaxResults(getPersistenceManager().getMaxFetchUI(metaClass.getName()));
            if (datasource instanceof AbstractCollectionDatasource)
                ((AbstractCollectionDatasource) datasource).setRefreshMode(refreshMode);
        } else {
            if (dsClass == null) {
                datasource = createCollectionPropertyDatasource();
            } else {
                datasource = (CollectionDatasource) dsClass.newInstance();
            }
            ((NestedDatasource) datasource).setup(id, master, property);
        }
    } catch (InstantiationException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }
    datasource.setSoftDeletion(softDeletion);
    datasource.setCacheable(cacheable);
    datasource.setAllowCommit(allowCommit);
    registerDatasource(datasource);
    return datasource;
}

您这是哪个类,不是我说的类吧

ScreenPermissionTreeDatasourceCollectionDatasource的子类,感觉它通过 collectionDatasource 组件去加载的,我没调试过,只是看了下代码。
image

你看 buildCollectionDatasource()方法里是不是有个datasource = (CollectionDatasource) dsClass.newInstance();,如果你在这里找到了ScreenPermissionTreeDatasource说明猜测没问题。

com.haulmont.cuba.gui.data.DsBuilder这个类里的方法

明白了,是从XML里加载创建的。

是的
image

调用栈很深,是从这里开始的
image

1 个赞

把这个datasourceClass="com.haulmont.cuba.gui.app.security.ds.ScreenPermissionTreeDatasource">重写了可能就OK :grin:

2 个赞

是的,已搞定,谢谢了!