不知道这个类是怎么注册到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 个赞
是的,已搞定,谢谢了!