不知道这个类是怎么注册到Spring的,我用<bean id=“cuba_ScreenPermissionTreeDatasource” 没成功,可以通过id来重写这个类么?
貌似用Guice注入的
不是吧,是spring注入的
   Component instance = constructor.newInstance();
        autowireContext(instance);
        initCompositeComponent(instance, componentClass);
看到了这个,反射创建实例后在放到spring applicationContext中。虽然没看到 ScreenPermissionTreeDatasource的创建,但感觉可能也是这样操作的 
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;
}您这是哪个类,不是我说的类吧
ScreenPermissionTreeDatasource是 CollectionDatasource的子类,感觉它通过 collectionDatasource 组件去加载的,我没调试过,只是看了下代码。

你看 buildCollectionDatasource()方法里是不是有个datasource = (CollectionDatasource) dsClass.newInstance();,如果你在这里找到了ScreenPermissionTreeDatasource说明猜测没问题。
 com.haulmont.cuba.gui.data.DsBuilder这个类里的方法
明白了,是从XML里加载创建的。
是的

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

           
           
           1 个赞
         
         把这个datasourceClass="com.haulmont.cuba.gui.app.security.ds.ScreenPermissionTreeDatasource">重写了可能就OK 
           
           
           2 个赞
         
         是的,已搞定,谢谢了!